<?xml version="1.0" encoding="UTF-8"?>
<hibernate-generic datetime="2026-02-04 08:56:55">
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912280</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Testing TransmogrifyMDB and Ingest]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945035</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11013509</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:17:35.783</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912281</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912282</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912286</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912288</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912290</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356145</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Republishing Data From SIAM Node]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388898</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-13 13:26:51.170</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-13 13:26:51.170</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179945</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212710</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10455990</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10455991</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343552</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1933368</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-06-16 10:34:34.160</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179946</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179947</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162927</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766118</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766120</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766122</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766124</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9372424</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10354987</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ConfluenceBandanaRecord" package="com.atlassian.confluence.setup.bandana">
<id name="id">32809</id>
<property name="context"><![CDATA[SSDS]]></property>
<property name="key"><![CDATA[atlassian.confluence.theme.settings]]></property>
<property name="value"><![CDATA[<map>
  <entry>
    <string>theme.key</string>
    <string></string>
  </entry>
</map>]]></property>
</object>
<object class="ConfluenceBandanaRecord" package="com.atlassian.confluence.setup.bandana">
<id name="id">32810</id>
<property name="context"><![CDATA[SSDS]]></property>
<property name="key"><![CDATA[atlassian.confluence.space.settings]]></property>
<property name="value"><![CDATA[<com.atlassian.confluence.setup.settings.SpaceSettings>
  <spaceKey>SSDS</spaceKey>
  <disableLogo>false</disableLogo>
  <colourSchemesSettings>
    <colourSchemeType>custom</colourSchemeType>
  </colourSchemesSettings>
</com.atlassian.confluence.setup.settings.SpaceSettings>]]></property>
</object>
<object class="BlogPost" package="com.atlassian.confluence.pages">
<id name="id">6259415</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Getting back on track with development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">6226616</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 08:57:57.783</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 08:57:57.787</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456506</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[M0 Text File Generation Scripts]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489270</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">4555174</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">4555175</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">4555176</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-05-30 15:28:37.337</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-05-30 15:57:40.887</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456509</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926583</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[2011 Proposal Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959345</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-27 14:50:24.337</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-08-02 06:58:42.843</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926586</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926627</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926661</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926683</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ConfluenceBandanaRecord" package="com.atlassian.confluence.setup.bandana">
<id name="id">32818</id>
<property name="context"><![CDATA[SSDS]]></property>
<property name="key"><![CDATA[atlassian.confluence.css.resource.counter]]></property>
<property name="value"><![CDATA[<int>2</int>]]></property>
</object>
<object class="Space" package="com.atlassian.confluence.spaces">
<id name="id">2</id>
<property name="name"><![CDATA[Shore Side Data System (600031 and 900823)]]></property>
<property name="key"><![CDATA[SSDS]]></property>
<property name="description" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">9</id>
</property>
<property name="homePage" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<collection name="permissions"><element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">45</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">46</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">47</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">48</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">49</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">50</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">51</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">52</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">53</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">54</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">55</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">56</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">57</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">58</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">4882506</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">4882507</id>
</element>
<element class="SpacePermission" package="com.atlassian.confluence.security"><id name="id">19300614</id>
</element>
</collection>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.590</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:50:44.757</property>
<property name="spaceType">global</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356413</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389125</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461968</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461969</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461970</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461971</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461972</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461973</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.233</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356415</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356417</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356420</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356436</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356446</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356453</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356455</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912252</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Weekly Notes from January 12, 2006]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945007</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11013138</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-12-28 13:54:14.490</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-12-28 13:54:14.490</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240414</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273151</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13205730</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13205731</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13205732</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13205733</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13205734</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.297</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240415</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240417</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240419</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240421</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240422</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240424</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240426</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13140041</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13140043</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13140045</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355890</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388616</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10458414</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:52:13.317</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355891</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355894</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355895</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355897</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355898</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355900</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355902</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">10485949</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">10485950</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356090</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Transmogrify and Ingest Deployment]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388846</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 13:08:50.467</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:35:51.147</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912291</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912293</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13140051</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912345</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Data Simulator]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945092</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-05 11:43:47.797</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-05 11:43:47.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797071</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797073</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829824</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">17564847</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-09 08:02:11.717</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777248</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777250</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777251</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777253</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777255</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777257</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16777259</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17465499</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17465504</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17465506</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17465507</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17465509</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797073</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[April 27, 2010]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829826</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:32:49.873</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:35:39.053</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797075</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797077</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">841</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">838</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341540</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341541</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341542</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341543</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341544</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341545</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341546</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341547</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341548</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11341549</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343543</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.183</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">844</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">847</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">849</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">850</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">851</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456469</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456477</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456478</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5832936</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5832939</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5832941</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913006</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913010</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913012</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913014</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913016</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913017</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913019</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913027</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913029</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8913100</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355400</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355406</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355411</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355413</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355415</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355416</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355417</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355419</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355421</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355423</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355426</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355429</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355431</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355433</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355436</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355438</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355440</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11240412</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355664</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388392</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">25559138</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">25559139</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">25559140</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322082</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322092</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322148</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322158</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322168</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322170</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322228</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">11370504</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">14647300</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">17334274</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">22020097</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">24412192</id>
</element>
</collection>
<collection name="trackbackLinks"><element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">21495819</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">21495826</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">21495827</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">21495828</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22446082</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22446083</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22642689</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22642690</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22642691</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">22806529</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134209</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134210</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134211</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134212</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134213</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134214</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134215</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134216</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134217</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134218</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134219</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134220</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134221</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134222</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134223</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134224</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23134225</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23822337</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23822338</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23822339</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23822340</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23822341</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953412</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953415</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953416</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953418</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953420</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953422</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953423</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953425</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953428</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953429</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953432</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953433</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953436</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953437</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953440</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953442</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953446</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953447</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953448</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953449</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953450</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953451</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953452</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953454</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953455</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953456</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953458</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953459</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953460</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953462</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953463</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953464</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953465</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953466</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953467</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953468</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953469</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953470</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953492</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953504</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953524</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953573</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953574</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953575</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953576</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953584</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953610</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953636</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953641</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">23953643</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379406</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379424</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379499</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379503</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379614</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379696</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379703</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379733</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379751</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">24379787</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034792</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034802</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034905</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034908</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034909</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034912</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034947</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25034983</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035000</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035010</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035112</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035172</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035173</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035224</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035301</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035332</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035463</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035511</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035572</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035593</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035625</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035694</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25035702</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362438</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362487</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362492</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362596</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362647</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362686</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362696</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362720</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362765</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362798</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362809</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362813</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362815</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362816</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362820</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362913</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362915</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362938</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25362957</id>
</element>
<element class="TrackbackLink" package="com.atlassian.confluence.links"><id name="id">25363009</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2014-03-05 15:54:32.787</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355668</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355670</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355672</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355674</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355676</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355678</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355680</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355682</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355684</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355687</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355689</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355691</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">25395369</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179738</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637846</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212505</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848524</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848525</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848526</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848527</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848528</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848529</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848530</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848531</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848532</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">6848533</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343517</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849688</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849689</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849758</id>
</element>
</collection>
<property name="version">60</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.363</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179739</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179740</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179741</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179742</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179754</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179755</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179756</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179757</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179759</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179760</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179763</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179766</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179767</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179769</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179770</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179783</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179784</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179785</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179786</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179897</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179898</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179899</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179900</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179901</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179902</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179903</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179904</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179905</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179906</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179907</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179908</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179909</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179910</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179911</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179912</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179913</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179914</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179915</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179916</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179917</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179918</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179919</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179920</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179921</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162889</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162890</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162891</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162892</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162893</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456484</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456485</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456486</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456487</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456493</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456500</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915201</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915202</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">6750211</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">6750213</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236005</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268771</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777006</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777007</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777008</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777009</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777010</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777011</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.757</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236007</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236009</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236011</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236013</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236015</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236017</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236019</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236022</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236024</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236026</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236028</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236030</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236032</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236034</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236035</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236037</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236038</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236073</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236079</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236081</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236083</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236085</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236087</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236089</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236100</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236102</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236104</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236106</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236108</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236110</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236169</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">18579772</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170435</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170436</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170437</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170438</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170440</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170439</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170441</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170442</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13336581</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[DataContainer Importer]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13369349</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 09:14:10.053</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 09:14:10.053</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">596</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">597</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">635</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912252</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">594</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2996</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2997</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2998</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2999</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3000</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3001</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3002</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3003</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3004</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3005</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3006</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3007</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3008</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3009</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3010</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3011</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3012</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3013</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3014</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3015</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3016</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3017</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3018</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3019</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">3020</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343511</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.287</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">631</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">632</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">633</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">634</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">636</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">637</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">673</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">597</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[MTM_2007_01_17]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">595</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:16:37.923</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-17 10:16:37.923</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355863</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388630</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">16515520</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">16515521</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">16515522</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">16515523</id>
</element>
</collection>
<property name="version">72</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:12:36.213</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355864</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355885</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355992</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355993</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355995</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355997</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355999</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356001</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356003</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356004</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356006</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356007</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356008</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356010</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356012</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356013</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356015</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356017</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356053</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356055</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356060</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356062</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356064</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356065</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356068</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356070</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356072</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356076</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356078</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356080</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356082</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356084</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356086</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356088</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356411</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912264</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912277</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912278</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912347</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912348</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797149</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797151</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797153</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797155</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797157</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797255</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797256</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797258</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797261</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797262</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797264</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797266</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797268</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797269</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797271</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797273</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797275</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797277</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797279</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797280</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797282</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797284</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797286</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797287</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797289</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797291</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797292</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15631403</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16416858</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16416860</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16416861</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519682</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519683</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519684</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519685</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042895</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042896</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042897</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042898</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042899</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042901</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042902</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238276</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238277</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238278</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238279</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238280</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238281</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13238282</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519692</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519693</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519694</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519695</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519696</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519697</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519698</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519699</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042891</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11763748</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519701</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519702</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519703</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519704</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519705</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519706</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519707</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519708</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519709</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519710</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042893</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637922</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670672</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013699</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013700</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013701</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013702</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013703</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013704</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013705</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013706</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013707</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013708</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013709</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013710</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013711</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013712</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013713</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013714</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013715</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013716</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013717</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013718</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013719</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013720</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013721</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013722</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5013723</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849759</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849761</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849781</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.773</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637927</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637930</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637934</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637936</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637938</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637940</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637942</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637944</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637946</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637949</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637988</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637992</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3637995</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638003</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638005</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638007</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638008</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638010</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638012</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638014</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638016</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638018</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638020</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638022</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638029</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638037</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638039</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638041</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638043</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638045</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638047</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638114</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638116</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638118</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638119</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3638121</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456497</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915259</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915267</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">3735602</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">3735607</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">3735622</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">5046287</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797058</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Migration to Google Code Base]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829811</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-26 16:05:08.450</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-26 16:09:33.953</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797060</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17858877</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[SQL 2008 Upgrade and Move to Dione]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17891620</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-07-15 08:16:34.157</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-07-15 22:59:59.387</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">17858879</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">18251779</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5374184</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Matlab 2008a Integration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5406932</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">5505494</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[brian]]></property>
<property name="creationDate">2008-06-17 16:49:15.183</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-06-17 16:50:54.130</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">5374188</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5374189</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">91</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">5374184</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911819</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13336581</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">89</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13434985</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13434986</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13434987</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13434988</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">13434989</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.707</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">92</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">93</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">94</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5374178</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">6750218</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766094</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766095</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766099</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766113</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766114</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">7766116</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355857</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355859</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355860</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9798394</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911806</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911807</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911808</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911817</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911824</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911828</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911831</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911834</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911837</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911839</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911846</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13336579</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897132</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897133</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897134</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897135</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897136</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897137</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897138</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897139</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897140</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897141</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897142</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897143</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897144</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897145</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897146</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042821</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042822</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042823</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042824</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042825</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042826</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042827</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042828</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042829</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042830</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042831</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042832</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042833</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042834</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042835</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042836</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042837</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042838</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042839</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042840</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042841</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042842</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042843</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042844</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042845</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042846</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042847</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042848</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042849</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042850</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042851</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042852</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797681</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830450</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896416</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896417</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896418</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896419</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:27:43.893</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797682</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797684</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797686</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797687</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797754</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">9928708</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">9928709</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912969</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Data Producer Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945734</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:35:49.373</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:53:57.393</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912973</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912981</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912985</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797689</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[2004-04-20 CIMT SSDS Meeting Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830458</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896140</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896141</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896142</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896143</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896144</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896145</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896146</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896147</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896148</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896149</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896150</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896151</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896152</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896153</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896154</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">9896155</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:11:31.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.760</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797691</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">635</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Weekly Notes from January 5, 2006]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">633</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2831</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">2832</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-19 09:03:26.357</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:14:33.853</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">638</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179794</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212561</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">1246186</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">1246187</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">1246188</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343512</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343518</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343519</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343520</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343523</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343524</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343525</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343526</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849704</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-13 08:42:47.643</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179795</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179801</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179802</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179803</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179804</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179808</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179809</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179810</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179811</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179832</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540110</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540114</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540115</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">80</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356090</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356145</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912345</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797058</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17858877</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">78</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777012</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777013</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777014</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777015</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777016</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777017</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777018</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777019</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777020</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777021</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777022</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777023</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777024</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777025</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777026</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777027</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777028</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777029</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777030</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777031</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777032</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777033</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777034</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777035</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777036</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777037</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777038</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777039</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777040</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777041</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777042</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777043</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777044</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777045</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777046</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777047</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777048</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777049</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777050</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777051</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777052</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777053</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777054</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777055</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777056</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777057</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777058</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777059</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777060</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777061</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777062</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777063</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777064</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777065</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777066</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777067</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777068</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777069</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777070</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777071</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777072</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777073</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777074</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777075</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777076</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777077</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777078</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777079</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777080</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777081</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777082</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777083</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777084</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777085</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777086</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777087</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777088</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">18777089</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">206</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343516</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343521</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343556</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1933370</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">3604482</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849690</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849757</id>
</element>
</collection>
<property name="version">78</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.880</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">89</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">90</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">840</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179793</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179818</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179922</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179944</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179951</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179953</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179955</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179958</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179959</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179960</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179961</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179974</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179975</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162835</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">2162836</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3114484</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456467</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456468</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456471</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456473</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456474</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456489</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456491</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456508</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915255</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061034</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061036</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061038</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355861</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355892</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355896</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355953</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356018</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356020</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356087</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356136</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356152</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355911</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355912</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912284</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912285</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912289</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912295</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797054</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797069</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">11797078</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664434</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664509</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926581</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15204476</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630753</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630755</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630757</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630758</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630761</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630763</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630775</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630779</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630781</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630796</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630798</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630801</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630803</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630804</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630805</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630807</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630809</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630811</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630812</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15631300</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15631302</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17236020</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17858875</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">18579773</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540129</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">13860906</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728688</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728689</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728690</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728691</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728692</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728694</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728695</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728696</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728697</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">15728698</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">81</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[ProjectRequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">79</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010504</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010505</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010506</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010507</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343515</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:13:04.743</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:10:29.840</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">9797679</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9798260</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">9798261</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911833</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">9928713</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">9928756</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">9928757</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">82</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[MSERequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">80</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">167</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">168</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">169</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">170</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">171</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">172</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">173</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">174</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">175</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">176</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">177</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">178</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">179</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">180</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">181</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">182</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">7</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343514</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:18:56.927</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.387</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">83</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">84</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">85</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637846</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Cleanup Configuration Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670596</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-06 14:31:26.493</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:47:30.393</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456495</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911836</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Related Resources]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944600</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010561</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010562</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010563</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010564</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010565</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010566</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010567</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010568</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:11:13.457</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.937</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911840</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911841</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911842</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356008</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[An example use of Graphs - FOCE]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388734</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461536</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461537</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-17 09:07:20.000</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 13:48:58.817</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356010</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356352</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911848</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944612</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-11-02 09:20:41.893</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911849</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911850</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911851</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911853</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911863</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911869</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911871</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042855</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042857</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042859</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042861</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042863</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042864</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042862</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042860</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042858</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042856</id>
</element>
<element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061037</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093800</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461643</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461644</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">10461645</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 16:19:18.840</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061040</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061042</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061044</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061046</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061048</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061049</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061050</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061052</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061053</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061055</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061057</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061059</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061061</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061063</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061065</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061067</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8061069</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356160</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356161</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356163</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356358</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356361</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356365</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356367</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10356368</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519712</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912971</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945735</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-07 17:28:29.780</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912975</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911829</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911830</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911843</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912354</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10912357</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911819</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[RIA Technologies for the SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944585</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 16:52:33.203</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:54:46.730</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911821</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911822</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">674</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">671</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343513</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 16:48:51.420</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">675</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">676</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">677</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">678</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">679</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">680</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">681</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664436</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697187</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">14024905</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-28 08:02:19.393</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664438</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664440</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664442</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664444</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664446</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664448</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664450</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664452</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664453</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664455</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664457</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664458</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664460</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664462</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664489</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664491</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13664501</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926410</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926447</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926449</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">13926588</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10</id>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706100</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706101</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706102</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706103</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706104</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706105</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706106</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706107</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">15706108</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">11</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">205</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">238</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343502</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343522</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1343555</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1933369</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">1933373</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">3276803</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">3276804</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">3276805</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4390913</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849675</id>
</element>
<element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">4849760</id>
</element>
</collection>
<property name="version">47</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.763</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">14</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">16</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">17</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">25</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">27</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">28</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">31</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">32</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">34</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">35</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">36</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">39</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">40</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">41</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">43</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">44</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">57</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">58</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">60</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">61</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">62</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">63</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">64</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">75</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">76</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">77</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">78</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">79</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">86</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">87</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">88</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">630</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1050</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179735</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179736</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179737</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">3113031</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456480</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456482</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456483</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4456490</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">4915257</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">5832937</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">6750214</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">15630800</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355981</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="children"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912969</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</element>
</collection>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388742</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010569</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010570</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010571</id>
</element>
<element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">11010572</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:41.500</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355983</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355985</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355986</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355988</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8355990</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356114</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356116</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356216</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8356217</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912922</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912925</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912972</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912974</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912977</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912978</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912979</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">8912983</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">10911844</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179819</id>
<property name="parent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<collection name="ancestors"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</element>
</collection>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212586</id>
</element>
</collection>
<collection name="outgoingLinks"><element class="OutgoingLink" package="com.atlassian.confluence.links"><id name="id">1246185</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-13 00:12:01.220</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179820</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179821</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179822</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179823</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179824</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179825</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179826</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179827</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179828</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179829</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179830</id>
</element>
<element class="Page" package="com.atlassian.confluence.pages"><id name="id">1179831</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="attachments"><element class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540118</id>
</element>
</collection>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035593</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://rafaelcaroni.com.br/groups/inside-significant-factors-of-the-pirate-bay-proxy/]]></property>
<property name="title"><![CDATA[bit torrent finder]]></property>
<property name="blogName"><![CDATA[bit torrent finder]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-23 11:47:54.850</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-23 11:47:54.850</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093800</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

{note:title=Does not go through ingest}
Note that this process does not send a JMS packet through the normal ingest chain. If you are SSDS savy, this means it will skip the transmogrify-ingest-ruminate step and put this information directly in the database.
{note}
# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\

h2. Generate a packet from a file and publish to SSDS
{warning:title=Under Construction}
This section is still under construction, pay no attention
{warning}
# Download a jar file
# Create the properties file like the one here:
{noformat}
# This file contains the information that will be used to construct a data packet to publish to SSDS.

# This is a SIAM property that (in theory) would allow multiple message formats
# that can be handled.  Right now, there is only one and it should always be 0.
DevicePacketVersion=0

# This is the ID of the source of the data (i.e. the device that generated the packet
# being sent.
SourceID=1

# This is the timestamp on the packet which normally represents when the packet
# was created.  In the system it is normally epoch seconds, but for clarity sake,
# you can enter it in ISO 8601 format (http://en.wikipedia.org/wiki/ISO_8601)
Timestamp=2009-09-30T15:47:00Z

# This is the sequence number that will be on the packet. It should reflect the
# index in the order of generation of packets from the source device.
SequenceNumber=1

# This is the reference number that points to the sequence number of the packet
# which contains the metadata that describes the contents of this packet. 
MetadataRef=0

# This is the ID of the parent device (if one exists) that the generating device
# (see SourceID above) was connected to when it generated the packet
ParentID=0

# This is the type of record that is being produced.  Source devices can produce
# multiple types of records of the same type. For example, a device can produce
# data records in multiple formats.  This allows you to identify which format 
# is used for the generated packet.  It serves to link the pre-defined metadata
# to the packet and allows machines and humans to understand the contents of the
# packet.
RecordType=0

# This value determines what type of packet (SIAM equivalent) will be constructed
# using the information in this file.  The available options are:
# 1. METADATA
# 2. SENSOR_DATA
# 3. DEVICE_MESSAGE
SecondStreamID=METADATA

# This indicates which version of the above type of packet will be constructed.
# At the time of this authoring, the only option available is 0 for all three
# types listed above. In theory this would allow you to have multiple forms of
# any of the above types of packets, but it has not been used to date.
SecondPacketVersion=0

# This is the name of the file (located with this properties file) that contains
# the payload of the first buffer.  It will be read as straight bytes into a
# byte buffer. NOTE: with METADATA packets the first buffer contains something
# that is called 'cause' which is not used much by SSDS.
FirstBuffer=test-first-buffer.txt

# This is the name of the file (located with this properties file) that contains
# the payload of the second buffer.  It will be read as straight bytes into a
# byte buffer. NOTE: with METADATA packets the second buffer is usually where the
# main metadata is stored (for example, device XML).
SecondBuffer=test-second-buffer.xml

{noformat}
# Create the two buffer files
# Run using command:
{noformat}
the command
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849761</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/pages/editpage.action?pageId=3637922]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-05 13:14:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-09 09:38:15.023</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849760</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/pages/editpage.action?pageId=10]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-05 12:57:15.033</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-05 12:57:15.033</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849759</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/display/SSDS/Tasks]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-05 12:57:15.030</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-09 09:39:15.030</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1050</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1047</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 08:43:12.000</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849758</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-05 12:57:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-09 09:39:15.027</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849757</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/pages/editpage.action?pageId=80]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-05 12:56:15.067</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-05 12:56:15.067</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212505</id>
<property name="body"><![CDATA[{warning:title=This list no longer updated}
This task list is being kept for posterity sake and that it has some desired tasks that were shelved for a later date. The task that are currently being worked on are managed in the project plan located [here|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html|Project Plan]
{warning}

The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849781</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/pages/viewpageattachments.action?pageId=3637922&sortBy=date&highlight=After+Cleanup+Deployment.jpg&]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-09 09:37:15.037</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-09 09:37:15.037</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">24412192</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://www.google.com/]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-31 06:20:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-31 06:20:15.027</property>
</object>
<object class="SpaceDescription" package="com.atlassian.confluence.spaces">
<id name="id">9</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="title"/><collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.420</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:50:44.747</property>
<property name="versionComment"><![CDATA[]]></property>
<collection name="historicalVersions"><element class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">18</id>
</element>
<element class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">4456499</id>
</element>
</collection>
<property name="contentStatus"><![CDATA[current]]></property>
<collection name="labellings"><element class="Labelling" package="com.atlassian.confluence.labels"><id name="id">8290315</id>
</element>
</collection>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926627</id>
<property name="title"><![CDATA[2011 Proposal Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959389</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-27 14:50:24.337</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-27 16:07:25.760</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035625</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://alyousefi.blogspot.com/2012/10/virtual-private-network.html]]></property>
<property name="title"><![CDATA[vpn provider usa]]></property>
<property name="blogName"><![CDATA[vpn provider usa]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-23 19:58:01.153</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-23 19:58:01.153</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926586</id>
<property name="title"><![CDATA[2011 Proposal Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959348</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-27 14:50:24.337</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-27 14:50:24.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926581</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959343</id>
</element>
</collection>
<property name="version">52</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-01 06:20:26.887</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240426</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273163</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 22:16:49.690</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240424</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273161</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 22:10:12.997</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926588</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959350</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-09 22:15:39.443</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240421</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273158</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:57:51.807</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240422</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273159</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 22:09:00.093</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240419</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273156</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:53:02.957</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240417</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273154</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:45:34.463</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240415</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273152</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:41:49.343</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11240412</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11273149</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 18:00:08.287</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">18251779</id>
<property name="title"><![CDATA[SQL 2008 Upgrade and Move to Dione]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">18284547</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-07-15 08:16:34.157</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-07-15 08:27:43.657</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17858877</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849704</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-03 13:53:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-03 13:53:15.023</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849690</id>
<property name="viewCount">5</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-03 13:17:15.037</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-05 12:56:15.063</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035694</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.senadoredgarespindola.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-24 14:01:09.170</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-24 14:01:09.170</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896147</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896146</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896145</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896144</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896143</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896142</id>
<property name="destinationPageTitle"><![CDATA[C]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896141</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896140</id>
<property name="destinationPageTitle"><![CDATA[A]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035702</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.itgovernance.co.za/00/index.php?option=com_lyftenbloggie&view=entry&year=2009&month=10&day=04&id=1:welcome-to-it-governance-blog]]></property>
<property name="title"><![CDATA[small business loans chase]]></property>
<property name="blogName"><![CDATA[small business loans chase]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-24 17:51:04.690</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-24 17:51:04.690</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">180</id>
<property name="destinationPageTitle"><![CDATA[//egy.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896152</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926447</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959214</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-07 12:30:20.533</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">181</id>
<property name="destinationPageTitle"><![CDATA[//www.oceansites.org/OceanSITES/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896153</id>
<property name="destinationPageTitle"><![CDATA[A]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">182</id>
<property name="destinationPageTitle"><![CDATA[//ingrid.ldgo.columbia.edu/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896154</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926449</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959216</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-09 21:46:59.717</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896155</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896148</id>
<property name="destinationPageTitle"><![CDATA[A]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896149</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896150</id>
<property name="destinationPageTitle"><![CDATA[A]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896151</id>
<property name="destinationPageTitle"><![CDATA[B]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:21:30.790</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:21:30.790</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959345</id>
<property name="body"><![CDATA[This body of work was to try and identify what SSDS changes need to be made to implement some sort of security and policy enforcement for the SSDS.  The first thing to do was to try and gather information about what people were looking for in access restrictions and such for their data.

h3. Tasks

Container-based security
## Setup security domain to work with I.S.'s Centrify system
#

Contextual-based security

Attribution Infrastructure


h3. Interview Notes

h5. Kanna Rajan (CANON)
I talked to Kanna about data access for CANON and his feeling was that it should not be open to the entire world, but within a group of collaborations, everyone should have access to the data that is part of the collaboration.  Sort of the once you're in, you're in idea.

h5. Francisco Chavez (CANON, BOG, Mooring)
# Francisco mentioned that a sort of standard data policy for academics is that raw data is embargoed for 2 years, after which the PI makes it available to the public.
# Ideally, there would be some way to automatically track all citations of data that people use for publications.
# He felt that there would probably be some limited number of options that data providers could choose from and apply to their data.  For example:
## Option 1: Data available to all
## Option 2: X Number of days embargo which nobody but the PI has access to the data after which it will be made public
## Option 3: X Number of days embargo which the public does not have access to the data, but a select group of collaborators might (defined by the PI).  After the X number of days, that data would be available to the public.
## Option 4: Different groups of users have different dates of embargo.  Group A has immediate access, Group B has 1 year embargo, public has 2 year embargo for example.
# He mentioned that maybe we should look at the policies used by the Climate Data Center
# He felt there should be some standard acknowledgement clause that tells people they need to cite the sponsors of the data they are utilizing.
# He felt there should be some granularity within CANON to control access to various data sources (this goes against what Kanna was saying).
# We should be able to remove people from the group of collaborations and thus remove access to the data.

h5. Dave Caress (MDUC CTD, MDUC Navigation, Mapping AUV)
# Some data available to all, some to collaborators
# Other data should be embargoed

h5. Jim Barry (MUCE, BI AUV)

h5. Charlie Paul (MUCE)
# Some data sources (instruments) can have their data available to the general public
# Some data sources (instruments) will only be available to specific people (could be maintained in groups)
## This data might be under an embargo of some time frame
# In all cases, MBARI and the PI should get cited when the data is used.

h5. Bill Ussler (MUCE)

h5. Ken Smith (Benthic Rover, BI AUV)

h5. Chris Scholin (CANON, ESP)

h5. Chris Grech (Ship/ROV Data)

h5. Steve E. (Ship/ROV Data, MARS Engineering)

h5. Nancy Jacobsen (Video)

h5. Craig Dawe (MARS Engineering Data)

h5. Paul McGill (MOBB)

h5. Andy Hamilton (Power Buoy)

h5. Ed Peltzer (FOCE)

h5. Peter Brewer (FOCE)

h5. Mapping AUV (Caress)

h5. Alex Worden

h5. Steve Haddock

h5. John Ryan

h5. Ken Johnson (ISUS)

h5. Mike Godin (AOSN, LRAUV)

h5. Jim Bellingham (AOSN, LRAUV)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379406</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://besiktas.hertaraftar.com/index.php?do=/blog/4880/an-analysis-of-significant-elements-in-the-pirate-bay-proxy/]]></property>
<property name="title"><![CDATA[torrent sites free]]></property>
<property name="blogName"><![CDATA[torrent sites free]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-28 05:49:57.870</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-28 05:49:57.870</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897131</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:42:44.010</property>
<property name="fileSize">15797</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">13</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212561</id>
<property name="body"><![CDATA[h2. Abstract

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

[Word document submitted 10 July 2007|^SSDS_Hardening_2008.doc].&nbsp;

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources.
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897133</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:04:57.857</property>
<property name="fileSize">5061</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897132</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:00:11.220</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">11</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://oceana.shore.mbari.org:8081/dashboard.action]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2006-10-25 21:59:15.057</property>
<property name="lastModifierName"/><property name="lastModificationDate">2006-11-09 15:00:15.027</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">179</id>
<property name="destinationPageTitle"><![CDATA[//www.cencoos.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897142</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:34:00.283</property>
<property name="fileSize">14876</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">11</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">7</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[http://wiki.mbari.org/ssds/moin.cgi/RequirementsDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"/><property name="creationDate">2006-10-24 15:29:15.043</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-06-22 13:12:15.057</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">178</id>
<property name="destinationPageTitle"><![CDATA[//www.pacoos.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897143</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:37:23.663</property>
<property name="fileSize">16136</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">12</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">177</id>
<property name="destinationPageTitle"><![CDATA[//www.epic.noaa.gov/epic/software/dapper/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897144</id>
<property name="fileName"><![CDATA[Flex_Development_Environment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-18 16:51:09.747</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 17:13:47.137</property>
<property name="fileSize">15473</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">176</id>
<property name="destinationPageTitle"><![CDATA[//strategies.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897145</id>
<property name="fileName"><![CDATA[Flex_Development_Environment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-18 16:51:09.747</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:51:09.747</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897144</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">175</id>
<property name="destinationPageTitle"><![CDATA[//earthobservations.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897146</id>
<property name="fileName"><![CDATA[Flex_Development_Environment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-18 16:51:09.747</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:58:22.057</property>
<property name="fileSize">7301</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897144</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">174</id>
<property name="destinationPageTitle"><![CDATA[//www.thecoolroom.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">173</id>
<property name="destinationPageTitle"><![CDATA[//seacoos.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">172</id>
<property name="destinationPageTitle"><![CDATA[//www.seamaven.org/sm.swf]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">171</id>
<property name="destinationPageTitle"><![CDATA[//www.gomoos.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897134</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:05:28.203</property>
<property name="fileSize">5132</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">170</id>
<property name="destinationPageTitle"><![CDATA[//oceanexplorer.noaa.gov/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897135</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:29:50.913</property>
<property name="fileSize">10351</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">169</id>
<property name="destinationPageTitle"><![CDATA[//www.earthsystemgrid.org]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897136</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:30:12.837</property>
<property name="fileSize">10663</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">168</id>
<property name="destinationPageTitle"><![CDATA[//www.geongrid.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897137</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:32:21.777</property>
<property name="fileSize">11395</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">6</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">167</id>
<property name="destinationPageTitle"><![CDATA[//www.openioos.org/index.html]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:40:10.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:40:10.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897138</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 11:03:21.593</property>
<property name="fileSize">12233</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">7</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897139</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 11:04:55.517</property>
<property name="fileSize">12231</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">8</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897140</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 12:53:34.467</property>
<property name="fileSize">12454</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">9</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">7897141</id>
<property name="fileName"><![CDATA[SSDS Flex Web Application Logical Deployment]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-11-14 10:00:11.220</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 13:16:46.150</property>
<property name="fileSize">14607</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">10</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">7897131</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">1246188</id>
<property name="destinationPageTitle"><![CDATA[]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-13 08:42:47.693</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-13 08:42:47.693</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">1246187</id>
<property name="destinationPageTitle"><![CDATA[//oceana.shore.mbari.org:8081/display/SSDS/Tasks]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-13 08:42:47.693</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-13 08:42:47.693</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212586</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## MOOS Data/metadata management for:
### M0 Mooring (CIMT)
### MTM1 Mooring (Closed)
### MTM2 Mooring (Closed)
### MTM3 Mooring (Closed)
### MSE Mooring (all four nodes)
### M0 Mooring processing/provenance tracked
### MSE Mooring processing/provenance tracked
# SSDS Beyond MOOS
## Data/Metadata management for:
### M1 Mooring
### M2 Mooring
### AUVCTD
### Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).
## AUVCTD metadata cataloged, raw data transformed, data provenance tracked
## OASIS Mooring data and metadata stored and cataloged, data provenance tracked
## Bruce Howe's Aloha Mooring (Puget Sound) data and metadata cataloged
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).  Most tools work on user's constructing data provenance and saving them, not dynamically tracked by system.
## Evidence of this is that SSDS is specified as a component for the ORION CyberInfrastructure.
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier (core data stream management easier 1 person can do work of 3-4 developers).
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
# How does this work support the strategic plan?
## I extracted the relevant points from the strategic plan at the bottom of this page.  I think you can probably answer them but if we want to hash over them some more, we can.
# How is this related to the Data Aggregation proposal?  I also included some answers below to the Criteria used for project evaluation.  Feel free to add/remove.
## Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets from.
# Why haven't we made more progress on science related user interfaces?
## Science requirement for MSE were very difficult to extract (some instruments were new to scientists) and a large portion of the SSDS time for 2007 was used by other software components in MOOS.
# What is SSDS' role in the ORION CI work?
## It is largely going to be used for metadata capture and catalog for observatory and instrument information and life cycle.  It will capture and store observatory and instrument metadata   (and some data) and make available to the CyberInfrastructure and it's users.
# What is the status of the Asset Tracking work?
## Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
# How much time will be requested?
## Largely this will come out of the proposal writing, but we should have some guess here (30 days me, 30 days you? ... total SWAG at this point). 
# Will this be the last year of the project? (or, when will SSDS be 'done'?)
## Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects or requests.
# Has anyone else showed interest in SSDS?
## Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">1246186</id>
<property name="destinationPageTitle"><![CDATA[//dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-13 08:42:47.693</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-13 08:42:47.693</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">1246185</id>
<property name="destinationPageTitle"><![CDATA[2008 Abstract]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-13 00:12:01.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-13 00:12:01.257</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379424</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.gnbl.or.kr/xe/?document_srl=170]]></property>
<property name="title"><![CDATA[Business Financing salary]]></property>
<property name="blogName"><![CDATA[Business Financing salary]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-29 18:10:08.843</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-29 18:10:08.843</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926410</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959178</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-30 17:08:32.583</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697187</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 134.89.2.25"}
{noformat}
so it will run the default server and it will bind to 134.89.2.25 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  
{note:title=CAUTION on binding}
Originally, I had assigned the bind to 0.0.0.0 as that was supposed to allow it to bind to all IP addresses associated with the server.  Normally this seems to work (and it did for the HTTP stuff), but the JMS clients were still getting 127.0.0.1 as the IP back from the server.  This was fixed by setting it to the correct IP address.  I have not really pushed on it much, but it could also have something to do with the /etc/hosts file which looks like:
{noformat}
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       new-ssds.mbari.org new-ssds localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
{noformat}
{note}
Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless=true -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}
# I was promptly hacked again by leaving the jmx-console and the web-console in place.  I removed those by shutting down jboss, removing jmx-console.war and the management directory from the the deploy directory, deleting the tmp and work directories and restarting.
# As an added security measure, we made root owner of all the files in the jboss directory structure except for the directories listed below which were owned by the process that runs JBoss (ApacheSSDSRO):
## JBOSS_HOME/server/default/data
## JBOSS_HOME/server/default/tmp
## JBOSS_HOME/server/default/work
## JBOSS_HOME/server/default/log
# I then removed the http-invoker.sar from the deploy directory to remove the HTTP invoker for JNDI, EJB and JMX.
# I then removed the jms/jbossmq-httpil.sar from the deploy directory to remove the HTTP Invoker for JMS.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5832937</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5865695</id>
</element>
</collection>
<property name="version">44</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-05 12:56:39.363</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5832936</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5865694</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:08:07.320</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356436</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389148</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 11:25:27.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356453</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389165</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 16:33:35.207</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356455</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389167</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:44:25.357</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356446</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389158</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 13:31:04.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5832941</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5865699</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-08-13 09:08:36.707</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5832939</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5865697</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-08-13 09:03:35.090</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456500</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489266</id>
</element>
</collection>
<property name="version">55</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:44:28.353</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456491</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489258</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:38:05.493</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456493</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489260</id>
</element>
</collection>
<property name="version">54</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:25:53.807</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456495</id>
<property name="title"><![CDATA[Cleanup Configuration Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489261</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-06 14:31:26.493</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:47:17.760</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637846</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456497</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489263</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:48:13.477</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379499</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://members.ebay.at/ws/eBayISAPI.dll?ViewUserPage&userid=malkiwa]]></property>
<property name="title"><![CDATA[klimatyzacja warszawa]]></property>
<property name="blogName"><![CDATA[klimatyzacja warszawa]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-03 07:38:04.443</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-03 07:38:04.443</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356420</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389132</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 11:16:06.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456508</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489272</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:41:18.093</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456509</id>
<property name="title"><![CDATA[M0 Text File Generation Scripts]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489273</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-05-30 15:28:37.337</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-05-30 15:28:37.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356411</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389123</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 13:08:40.227</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379503</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[https://plus.google.com/102235282021657999245/about?gl=pl&hl=pl]]></property>
<property name="title"><![CDATA[klimatyzacja]]></property>
<property name="blogName"><![CDATA[klimatyzacja]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-03 11:27:20.730</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-03 11:27:20.730</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356417</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389129</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 10:51:28.817</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356415</id>
<property name="title"><![CDATA[Qpid Exploration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389127</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 10:47:14.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 10:47:14.877</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456473</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489241</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:48:24.970</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456474</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489242</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:53:09.160</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456471</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489239</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:47:48.627</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456469</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489237</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-09 09:47:56.587</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456467</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489235</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-04-02 11:53:50.703</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456468</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489236</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:46:51.990</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356367</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389080</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 15:18:07.117</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356368</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389081</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 16:13:45.840</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911869</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944633</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:23:29.053</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911871</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944635</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:28:51.030</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356365</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389078</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 14:52:20.990</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456490</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489257</id>
</element>
</collection>
<property name="version">42</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:13:26.143</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343556</id>
<property name="viewCount">4</property>
<property name="url"><![CDATA[http://oceana:8081/pages/editpage.action?pageId=80]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-08-06 10:32:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-08-06 10:38:15.027</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456489</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489256</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:54:34.617</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23822337</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.elchamoliveawards.com/gallery/displayimage.php?pos=-110]]></property>
<property name="title"><![CDATA[proxy kat]]></property>
<property name="blogName"><![CDATA[proxy kat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-07 06:16:55.660</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-07 06:16:55.660</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343555</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/login.action?os_destination=%2Fdisplay%2FSSDS%2FWelcome%2Bto%2Bthe%2BShore%2BSide%2BData%2BSystem%2BProject]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-08-06 10:31:15.097</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-08-06 10:31:15.097</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456487</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489254</id>
</element>
</collection>
<property name="version">53</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:25:22.583</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23822339</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.asisystem.com/blog/post/2012/1/9/ASI-Launches-a-New-Brand%21.aspx]]></property>
<property name="title"><![CDATA[kick ass torrents]]></property>
<property name="blogName"><![CDATA[kick ass torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-08 16:09:08.557</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-08 16:09:08.557</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456486</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489253</id>
</element>
</collection>
<property name="version">52</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:16:22.557</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911863</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944627</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:06:04.880</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23822338</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.durepatent.com/4514]]></property>
<property name="title"><![CDATA[the pirate bay.org hindi]]></property>
<property name="blogName"><![CDATA[the pirate bay.org hindi]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-08 14:43:19.753</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-08 14:43:19.753</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456485</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489252</id>
</element>
</collection>
<property name="version">51</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:14:27.370</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23822341</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jackedgaming.com/?page_id=8]]></property>
<property name="title"><![CDATA[torrentscan music]]></property>
<property name="blogName"><![CDATA[torrentscan music]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-13 21:16:23.483</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-13 21:16:23.483</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456484</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489251</id>
</element>
</collection>
<property name="version">50</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-11-14 06:46:29.933</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456483</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489250</id>
</element>
</collection>
<property name="version">41</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:12:37.997</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23822340</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.mymundanemorning.com/?p=3452&cpage=150]]></property>
<property name="title"><![CDATA[katproxy]]></property>
<property name="blogName"><![CDATA[katproxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-11 11:28:08.327</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-11 11:28:08.327</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456482</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489249</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:11:09.467</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911851</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944615</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:42:10.737</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456480</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489247</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-01-10 05:40:42.947</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911853</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944617</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:44:49.860</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343552</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/dashboard.action]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-08-03 14:00:15.040</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-08-03 14:00:15.040</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456478</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489245</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:07:33.783</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4456477</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489244</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 09:47:48.633</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13336579</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13369347</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:30:52.963</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343543</id>
<property name="viewCount">4</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-13 15:28:15.047</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:50:15.037</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010561</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/expd/log/postcruise.asp?search=advanced]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010563</id>
<property name="destinationPageTitle"><![CDATA[//aosn.mbari.org/moqua]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010562</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/samplesDB/Queries]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343522</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 10:24:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:24:15.027</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010568</id>
<property name="destinationPageTitle"><![CDATA[//kepler-project.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010569</id>
<property name="destinationPageTitle"><![CDATA[Data Producer Services]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:27:41.543</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:41.543</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356361</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389074</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 14:18:30.187</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343523</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract?showComments=true&showCommentArea=true]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 10:32:15.017</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:32:15.017</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010570</id>
<property name="destinationPageTitle"><![CDATA[Data Producer Services]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:27:41.543</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:41.543</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343524</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract?focusedCommentId=1179797]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 10:33:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:33:15.027</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212710</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use a validating XML editor like XML Spy, oXygen, or jEdit to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the {color:#cc0000}{+}correct device ID{+}{color} *and* the {color:#cc0000}{+}correct XML{+}{color} file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS (which can take up to 5 minutes after the OASIS2SSDS has completed), the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct (also compare sequence number in query return and the raw data page), copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010571</id>
<property name="destinationPageTitle"><![CDATA[Data Services]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:27:41.543</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:41.543</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343525</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract?showComments=true&editComment=true&focusedCommentId=1179797]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 11:15:15.020</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 11:15:15.020</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356358</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389071</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-13 15:24:23.830</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010564</id>
<property name="destinationPageTitle"><![CDATA[//seacoos.org/Data%20Access%20and%20Mapping]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343526</id>
<property name="viewCount">5</property>
<property name="url"><![CDATA[http://oceana:8081/pages/editpage.action?pageId=1179794]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 11:27:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 14:13:15.047</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238277</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:16:37.033</property>
<property name="fileSize">16076</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">13</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010565</id>
<property name="destinationPageTitle"><![CDATA[//nautilus.baruch.sc.edu/carocoops_website/index.php]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238276</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-05 12:20:25.837</property>
<property name="fileSize">17424</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">12</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010566</id>
<property name="destinationPageTitle"><![CDATA[//maps.google.com]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010567</id>
<property name="destinationPageTitle"><![CDATA[//earth.google.com]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:18:53.953</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:18:53.953</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343514</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectRequirements]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:51:15.017</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:51:15.027</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238281</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:24:05.257</property>
<property name="fileSize">15136</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">17</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343515</id>
<property name="viewCount">6</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:51:15.043</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:51:15.030</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238280</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:22:31.793</property>
<property name="fileSize">15237</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">16</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356352</id>
<property name="title"><![CDATA[An example use of Graphs - FOCE]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10389065</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-17 09:07:20.000</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-17 09:13:24.580</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343516</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:51:15.050</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 09:51:15.050</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238279</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:20:02.247</property>
<property name="fileSize">14700</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">15</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343517</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:53:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:24:15.023</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238278</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:17:37.123</property>
<property name="fileSize">16555</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">14</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010572</id>
<property name="destinationPageTitle"><![CDATA[Data Services]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:27:41.543</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:41.543</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343518</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:56:15.020</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 14:15:15.013</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343519</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://oceana:8081/login.action?os_destination=%2Fpages%2Fviewpage.action%3FspaceKey%3DSSDS%26title%3D2008%2BAbstract]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:56:15.020</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:00:15.090</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343520</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/pages/viewpage.action?spaceKey=SSDS&title=2008+Abstract]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 10:00:15.090</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:00:15.090</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343521</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/2008+Abstract?showComments=true&showCommentArea=true]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 10:24:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 10:24:15.023</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13238282</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:29:48.487</property>
<property name="fileSize">21036</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">18</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134217</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jerome2009.kilu.de/]]></property>
<property name="title"><![CDATA[jerome2009.kilu.de]]></property>
<property name="blogName"><![CDATA[jerome2009.kilu.de]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-23 06:33:04.030</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-23 06:33:04.030</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911808</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944575</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:16:33.617</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911807</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944574</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:16:01.557</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134216</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://asasian.net/V2/modules.php?name=Your_Account&op=userinfo&username=JulioW88]]></property>
<property name="title"><![CDATA[visit this site right here]]></property>
<property name="blogName"><![CDATA[visit this site right here]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-18 13:05:35.467</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-18 13:05:35.467</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134215</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.gamers-forum.com/member.php?u=60634-SusannahY]]></property>
<property name="title"><![CDATA[Torrent]]></property>
<property name="blogName"><![CDATA[Torrent]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-18 11:12:51.047</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-18 11:12:51.047</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134214</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://qualityarticle.info/article.php?id=11347]]></property>
<property name="title"><![CDATA[katproxy]]></property>
<property name="blogName"><![CDATA[katproxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-15 18:26:21.390</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-15 18:26:21.390</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134221</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://mathieu.deregel.free.fr/displayimage.php?album=8&pos=64]]></property>
<property name="title"><![CDATA[kat proxy]]></property>
<property name="blogName"><![CDATA[kat proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-25 06:25:32.853</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-25 06:25:32.853</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134220</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://bang.hosting.paran.com/zbxe/gallery_bg/16631]]></property>
<property name="title"><![CDATA[the pirate bay]]></property>
<property name="blogName"><![CDATA[the pirate bay]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-24 18:41:48.100</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-24 18:41:48.100</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911806</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944573</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-05-11 09:18:18.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134219</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://lebreiros.com.br/wordpress/lebreiros-no-adventure-camp-etapa-de-brotassp/]]></property>
<property name="title"><![CDATA[katproxy]]></property>
<property name="blogName"><![CDATA[katproxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-24 17:58:08.233</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-24 17:58:08.233</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134218</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[https://twitter.com/WatchOSimpsons]]></property>
<property name="title"><![CDATA[look at these guys]]></property>
<property name="blogName"><![CDATA[look at these guys]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-23 17:20:20.880</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-28 09:07:42.490</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134225</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.stats-domain.com/siteinfo/proxykat.net]]></property>
<property name="title"><![CDATA[see post]]></property>
<property name="blogName"><![CDATA[see post]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-29 02:19:38.327</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-29 02:19:38.327</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15631403</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15664154</id>
</element>
</collection>
<property name="version">68</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 22:44:20.117</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134224</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.holidaysamerica.com/blogs/1896/3374/immediate-products-in-the-pirate]]></property>
<property name="title"><![CDATA[torrent search pirate]]></property>
<property name="blogName"><![CDATA[torrent search pirate]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-28 21:51:25.183</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-28 21:51:25.183</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134223</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.kid-korner.com/groups/considering-real-world-kat-proxy-products/]]></property>
<property name="title"><![CDATA[proxykat]]></property>
<property name="blogName"><![CDATA[proxykat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-27 05:12:24.757</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-27 05:12:24.757</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911817</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944584</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:17:09.213</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134222</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.aloveforever.eu/?L=blogs.blog&article=187]]></property>
<property name="title"><![CDATA[why is the pirate bay down november 2012]]></property>
<property name="blogName"><![CDATA[why is the pirate bay down november 2012]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-26 10:36:44.287</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-26 10:36:44.287</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489270</id>
<property name="body"><![CDATA[*M0 Text File Generation Scripts - Documentation*

Created by Seth Bushinsky - May 30, 2008 \\

*Purpose:*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; These programs produce text files from available M0 data.&nbsp; Two types of text files are produced: one set of files for each M0 deployment which consists of one text file per instrument and two text files (one for surface data, one for profile data) that include selected data for all M0 deployments that can be read into Loboviz ([http://www.mbari.org/lobo/loboviz.htm]) All files can be read using ODV or any text reader.&nbsp; \\

*Deployment Instrument Files:*

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location: \\Tornado\ssdsdata\deployments\m0\ \[YYYYMM\] \ascii_output

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example (\\Tornado\ssdsdata\\deployments\m0\200706\ascii_output) Files created by 'nc_loaddap_text.m' called with the appropriate deployment date by a crontab script on Elvis (see table at the end of this document).

&nbsp;
*For mooring turnaround*,

go to new deployment folder (\\Tornado\ssdsdata\deployments\m0\ \[YYYYMM\] ) and create sub-directory titled "ascii_output".&nbsp; Then change deployment call in crontab script - "cron_m0_txt_process".&nbsp; This should find all '.nc' files being created by ssds and make text files from these.

*Loboviz Text Files:*

This program produces two text files: M0PROF.txt and M0SURF.txt (along with M0PROF.cfg and M0SURF.cfg).&nbsp; Once a day, these files are copied by Loboviz and ingested so that the data can be plotted online.&nbsp;  File location: \\Tornado\ssdsdata\deployments\m0\ascii_all_dep.&nbsp;  Generated by "nc_loaddap_odv_surf.m" and "nc_loaddap_odv_prof.m".&nbsp; These files read in the netcdf files generated by ssds, as well as nitrate data from&nbsp; \\Tornado\ssdsdata\isuscimt\data\M0.txt .&nbsp; The netcdf file names are hard-coded into the processing. This script is run once a day.&nbsp; It deletes the last 3 hours of data in the file (which are usually NaN's) and appends new data to the end of the files.&nbsp; It also generates the '.cfg' files that contain the number of lines of data in each file.

*For mooring turnaround,*

open _both_"nc_loaddap_odv_surf.m" and "nc_loaddap_odv_prof.m", go down to where the long list of netcdf files is under the heading "%% Load Variables" and add the new deployments' netcdf files to the list.&nbsp;

\*If there is a change to the mooring data or some other error, keep in mind that because these files are appended instead of re-written, the mistake will stay in the text files.&nbsp; If this happens, simply delete the files and new ones will be created.&nbsp; However, when this happens, open the text files the next day and look in the header for weird characters that sometimes get added next to the "micro" or "degree" symbols.&nbsp; These can trip up Loboviz and prevent data ingestion.&nbsp;

\\
*\| \*Program* \| *Machine* \| *Crontab Script* \| *Scripts called (next table has script location)* \| *'.m' file location* \|
| Text file generation | Elvis (user: ssdsadmin,   pw: water4u) | /bin/sh   /ssdsdata/deployments/m0/ascii_all_dep/cron/cron_m0_txt_process | nc_loaddap_text.m | \\Tornado\ssdsdata\deployments\m0\ascii_all_dep\mfiles |
| Loboviz file generation | Elvis | /bin/sh   /ssdsdata/deployments/m0/ascii_all_dep/cron/cron_m0_loboviz | nc_loaddap_odv_surf.m,   nc_loaddap_odv_prof.m | \\Tornado\ssdsdata\deployments\m0\ascii_all_dep\mfiles | \\ |]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134209</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jnj-jrim.ufree.kr/xe/345]]></property>
<property name="title"><![CDATA[katproxy]]></property>
<property name="blogName"><![CDATA[katproxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-06 11:08:48.603</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-06 11:08:48.603</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134212</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.lesfillesdes.com/userinfo.php?uid=36610]]></property>
<property name="title"><![CDATA[kick ass torrents]]></property>
<property name="blogName"><![CDATA[kick ass torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-09 20:23:47.617</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-09 20:23:47.617</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388392</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied (manually?) to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some information is out of date.

The Rover data is stored in the project share for the Rover (900502.BenthicRover), under Rover.Deployment.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and I believe it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Rover.Documents/Project.Data/ReprocessedData/RoverData_2007-2008_NewFormat.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intend to do this, but will log all data retroactively instead. 

h3. Logging Rover images to SSDS

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (when Rover is physically deployed off a ship, or spends a period of time doing a science or engineering project), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity. This provides an order and hierarchy for the data, and puts different kinds of data into different folders.

Each data file also has a standard format in the normalized scheme, making fields like timestamp the same for all Rover files.

The organization and renaming of files from the old format to the new format was performed manually, and only for those missions that appeared to have any data of interest that could be converted. The reformatting of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terribly misleading name) to either finalize or revoke the changes. Not ideal, but I don't know that you'll have to run this code ever again.

It appears the MARS Roverdeployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident yet.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  And I have a Perl script checked in, roverParse.pl, that can either submit records to SSDS, or log them to a file; this appeared to be working (logging to a file) when run against the reformatted data. All that would be required to submit the data to SSDS is setting a flag to submit data into the SSDS server, instead of logging it (recommend running against a test server first though, especially if you wanted to run it on the new MARS data, as it hasn't had much testing).  

I have some notional changes on where to fit metadata management into that script.  Some Perl was written to parse folder names, but it is in a very preliminary state.  And I started to verify the metadata submission process using SSDS testing utilities, but there were challenges I haven't overcome.  All this work was continuing up until my departure. 

The next steps will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records (hmm, might be better/faster to do this first?) (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs. (Paul McGill keeps a spreadsheet as current as he can that contains this information; make sure he updates the one that I added a sheet to, as it has a more thorough description of device IDs on all the deployments.)

The data records were most important data elements, but more data files appear to be in the data sets now (not sure which of the additional files are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also prefer to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them directly in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is entirely non-existent. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and putting that metadata in the name is very weak, as noted previously.

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, nor how much will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up on the Rover, to my knowledge.  (Note Oxygen's xsltproc does not correctly handle the XPath/XPointer, and so will not work; you must set the XSLT processor as part of the Transformation configuration settings.)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134213</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://auhostranks.com/www/proxykat.net]]></property>
<property name="title"><![CDATA[proxy kat]]></property>
<property name="blogName"><![CDATA[proxy kat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-14 21:06:42.687</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-14 21:06:42.687</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134210</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://proxykat.net/]]></property>
<property name="title"><![CDATA[proxykat]]></property>
<property name="blogName"><![CDATA[proxykat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-06 12:49:38.537</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-18 14:16:35.127</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23134211</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.dong-ha.com/xe/?document_srl=28217]]></property>
<property name="title"><![CDATA[music torrent sites]]></property>
<property name="blogName"><![CDATA[music torrent sites]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-10-08 17:59:34.370</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-10-08 17:59:34.370</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911842</id>
<property name="title"><![CDATA[Related Resources]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944606</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:11:13.457</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:17:40.047</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911841</id>
<property name="title"><![CDATA[Related Resources]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944605</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:11:13.457</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:17:05.233</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911840</id>
<property name="title"><![CDATA[Related Resources]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944604</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:11:13.457</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:11:13.457</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911839</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944603</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:12:20.553</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379614</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.m88u.com]]></property>
<property name="title"><![CDATA[m88]]></property>
<property name="blogName"><![CDATA[m88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-07 03:10:27.003</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-07 03:10:27.003</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911837</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944601</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:11:04.257</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945035</id>
<property name="body"><![CDATA[In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  You can see how the TransmogrifyMDB is deployed in a J2EE container on
[this page|Transmogrify and Ingest Deployment]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911850</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944614</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:41:40.960</property>
<property name="versionComment"><![CDATA[UI mockup Device Inspector Mockup edited by kgomes]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">3276803</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project?showComments=true&showCommentArea=true]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-01-04 14:03:15.130</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-01-04 14:03:15.130</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911849</id>
<property name="title"><![CDATA[Device Inspector]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944613</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:35:35.460</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:35:35.460</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">3276805</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/login.action]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-01-04 15:03:15.047</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-01-04 15:03:15.047</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">3276804</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-01-04 14:03:15.163</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-01-04 14:03:15.163</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911846</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944610</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:16:23.360</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911844</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944608</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:41:03.617</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911843</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944607</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:07:49.307</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896418</id>
<property name="destinationPageTitle"><![CDATA[]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-17 08:27:43.967</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:27:43.967</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896419</id>
<property name="destinationPageTitle"><![CDATA[2004-04-20 CIMT SSDS Meeting Notes]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-17 08:27:43.967</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:27:43.967</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896416</id>
<property name="destinationPageTitle"><![CDATA[Mooring QC Plot Requirements (Word)]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-17 08:27:43.967</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:27:43.967</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911824</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944590</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:42:45.317</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">9896417</id>
<property name="destinationPageTitle"><![CDATA[ProjectRequirements]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-17 08:27:43.967</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:27:43.967</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911821</id>
<property name="title"><![CDATA[RIA Technologies for the SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944587</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 16:52:33.203</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:52:33.203</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911822</id>
<property name="title"><![CDATA[RIA Technologies for the SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944588</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 16:52:33.203</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:54:28.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911833</id>
<property name="title"><![CDATA[ProjectRequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944598</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:13:04.743</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-05-06 08:26:01.893</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911834</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944599</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:08:32.223</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911831</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944596</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:00:39.297</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">17334274</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://us.yhs.search.yahoo.com/if?partnerid=yhs-if-comcast-production3&fr=yhs-if-comcast-production3&ei=UTF-8&p=www.graybeallogging.com &vm=r&YST_b=0]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2011-05-27 07:33:15.090</property>
<property name="lastModifierName"/><property name="lastModificationDate">2011-05-27 07:33:15.090</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911829</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944594</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:37:14.180</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911830</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944595</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:05:32.667</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10911828</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10944593</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:56:31.930</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926683</id>
<property name="title"><![CDATA[2011 Proposal Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959445</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-27 14:50:24.337</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-29 16:04:55.880</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13926661</id>
<property name="title"><![CDATA[2011 Proposal Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13959423</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-27 14:50:24.337</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-28 12:12:24.217</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926583</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945092</id>
<property name="body"><![CDATA[In order to test the various components in SSDS, a simulator was built to allow users to send messages as packets to the SSDS system for testing (and could be used to send messages to the production machine as well).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912345</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11763748</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:33:42.333</property>
<property name="fileSize">20815</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">11</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379696</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://Www.Arcadegame-Info.net/w/index.php?title=Short_Term_Working_Capital_And_Business_Capital]]></property>
<property name="title"><![CDATA[minority small business loans for women]]></property>
<property name="blogName"><![CDATA[minority small business loans for women]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-08 18:58:13.017</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-08 18:58:13.017</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362492</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://stadelmanforsenate.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-26 06:58:29.753</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-26 06:58:29.753</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664491</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697242</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-30 14:32:09.443</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362487</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.ghbet.com]]></property>
<property name="title"><![CDATA[à¹�à¸?à¸?à¸?à¸­à¸¥]]></property>
<property name="blogName"><![CDATA[à¹�à¸?à¸?à¸?à¸­à¸¥]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-26 05:35:23.037</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-26 05:35:23.037</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10354987</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10387742</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[rich]]></property>
<property name="lastModificationDate">2009-04-01 11:24:48.407</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035112</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[https://th-th.facebook.com/m88.m88a]]></property>
<property name="title"><![CDATA[m88]]></property>
<property name="blogName"><![CDATA[m88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-17 08:36:11.673</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-17 08:36:11.673</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22642689</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://xdownloadlife.altervista.org/blog/un-programma-di-file-sharing-limewire-ora-in-versione-5-5-16]]></property>
<property name="title"><![CDATA[the pirate bay movies online]]></property>
<property name="blogName"><![CDATA[the pirate bay movies online]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-14 16:20:08.520</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-09-14 16:20:08.520</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664501</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697252</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-30 14:34:57.570</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8</id>
<property name="body"><![CDATA[h5. SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

h5. Project Documentation:
# [Documents|SSDS Project Documentation]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]

h5. Tasks
# [Tasks] *Deprecated, see Project Documentation*

h5. Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

h5. Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|https://oceana.mbari.org/jira/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22642690</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://millvillemotorsports.com/MaurineLe]]></property>
<property name="title"><![CDATA[http://millvillemotorsports.com/]]></property>
<property name="blogName"><![CDATA[http://millvillemotorsports.com/]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-16 06:50:08.517</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-09-16 06:50:08.517</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22642691</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://teachershaveclass.org/index.php?do=/blog/30343/inside-significant-factors-of-the-pirate-bay-proxy/]]></property>
<property name="title"><![CDATA[the pirate bay proxy server uk]]></property>
<property name="blogName"><![CDATA[the pirate bay proxy server uk]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-24 03:29:14.763</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-09-24 03:29:14.763</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664509</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697260</id>
</element>
</collection>
<property name="version">51</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 09:30:58.793</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388742</id>
<property name="body"><![CDATA[This is the index page that lists all the various services in the SSDS and links to their respective documentation:

# [Data Producer Services]
## [createDuplicateDeepDeployment|Data Producer Services#createDuplicateDeepDeployment]
# [Data Services]
## [getDataStreamProperties|Data Services#getDataStreamProperties]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236073</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268838</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 12:34:13.060</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3011</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from June 1, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236013</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268779</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 21:59:01.810</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3010</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from May 25, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3009</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from May 18, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236011</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268777</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 21:34:24.167</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3008</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 27, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3007</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 21, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236017</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268783</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 22:49:38.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3006</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 13, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3005</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 6, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236015</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268781</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 22:10:28.103</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3004</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 30, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3003</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 23, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3002</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 9, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236022</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268788</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 23:11:46.283</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3001</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 2, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236019</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268785</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 22:55:27.077</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3000</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from February 16, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236020</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268786</id>
</element>
</collection>
<property name="version">75</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-02-03 09:00:15.857</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2999</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from February 2, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15631302</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15664052</id>
</element>
</collection>
<property name="version">74</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-02-03 08:58:49.733</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2998</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 26, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236026</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268792</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 09:39:37.650</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2997</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 12, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15631300</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15664050</id>
</element>
</collection>
<property name="version">73</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:33:51.610</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2996</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 5, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236024</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268790</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 08:35:18.723</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236030</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268796</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 10:35:30.917</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236028</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268794</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 09:40:40.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236034</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268800</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 11:53:40.090</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3020</id>
<property name="destinationPageTitle"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236032</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268798</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 10:47:50.617</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3018</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from April 05, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236038</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268804</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 12:23:05.953</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3019</id>
<property name="destinationPageTitle"><![CDATA[MTM_2007_01_17]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236037</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268803</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 12:10:31.200</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3016</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from February 14, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3017</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from February 27, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236035</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268801</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-31 12:09:27.737</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3014</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from January 24, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3015</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from January 31, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3012</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from June 8, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15204476</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15237240</id>
</element>
</collection>
<property name="version">53</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-27 14:33:07.063</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">3013</id>
<property name="destinationPageTitle"><![CDATA[OSG Meeting Notes from January 12, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:23:25.330</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:23:25.330</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179739</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212506</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 13:07:08.573</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">78</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [SPEPRJ:Installing RabbitMQ (AMQP) on RHEL5]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [O3S:OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]
# [Debugging quick look and contour wind stick plots]
# [SQL 2008 Upgrade and Move to Dione]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179740</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212507</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 13:10:48.547</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179741</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212508</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 13:39:28.773</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179742</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212509</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 13:52:47.273</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">80</id>
<property name="body"><![CDATA[h1. Requirements For MOOS Science Experiment

# General Requirements
## A website like that of CIMT/MTM
## A request for calibrated salinity instead of conductivity was made.
## A general comment was made how we should have something in place to notify data users that they need to acknowledge MBARI if data is used.
## Make sure ITD is OK with sharing images from camera and if 1 year embargo applies to that data.
# Instrument specific requirements
## MTM-4 Surface Node (*SSDS ID 1446*): There appear to be no real SSDS requirements for this.  There is no XML defined for this
### Satlantic Radiometer (*SSDS ID 1270*): This is a binary instrument that needs special processing to do anything useful with.  We have XML defined for it, but I suspect it is out of date.  The XML simply states that the DataStream is binary.
### Triaxys directional wave sensor (*SSDS ID 1286*):  This instrument has a fairly well behaved data structure. It does not appear that we have XML defined for this instrument, but we should.  I know it has been deployed and we are generating plots for it for MTM-3 which has ID of 1339.  Here is an example of a data record:
{{$WC,81,060108,1640,13.37,6000,01020,3.33,,132,0,-0.230,0.000,1.700,0.00,28.6,0.00,249,75,4308}}
### Heave Sensor (is this the Triaxys above?)
#### Unknown, assuming it will be just like plots on CIMT
### GPS (*SSDS ID 1287*): This is a standard GPS that we have been dealing with.  We have XML defined, but we need an application that user's can configure a watch circle and set an alarm that will send an email if it goes outside the circle.  Here is an example data record:
{{$GPRMC,104538,A,3648.2007,N,12147.2515,W,000.0,329.4,291105,014.8,E  * 6E}}
### ASIMET LWR (*SSDS ID 1289*): We have seen these instruments before.  We don't have any XML in CVS for it, but it seems like we should.  There might be a similar instrument on another deployment that we can take the XML from.  Here is an example of the data record 
{{294.45 294.46 11614.4 11597.3 -74.0 425.0 33284 33438 32760}}
### Radiometer, Long-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Short-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### ASIMET HRH (*SSDS ID 1290*): Again, one we have seen before, but no XML.  We should have some elsewhere.  Here is an example data record:
{{40.634 21.746 : 38124 40892}}
### Relative Humidity - Air Temp., ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### ASIMET WND (*SSDS ID 1291*): Same, no XML, but we have instruments just like it.  Here is an example of the data:
{{0.00 0.00 0.0 0.0 0.0 147.8 333.2 -4.8 4.7}}
### Wind Speed/Direction, ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### Power Can (*SSDS ID 1322*): We have XML, but we need to see if anything has changed.  A (large) example of the data (consult the data stream for more info):
{{ADC00 A+1.5209e-04 N0000600 L+1.5260e-03 H-1.2208e-03 D-3.0520e-04 E0}}
{{ADC01 A+1.8414e-04 N0000600 L+1.2208e-03 H-9.1560e-04 D-3.0520e-04 E0}}
{{ADC02 A+7.8088e-02 N0000600 L+7.3778e-02 H+8.1754e-02 D+0.0000e+00 E0}}
### Load cell 0-10,000 lbs. version A (Bridle)
#### Unknown, assuming it will be just like plots on CIMT
### P2 ADC
#### Unknown, assuming it will be just like plots on CIMT
### Nitrate Analyzer, ISUS
#### Assuming that Luke will be creating (or adding to the current) ISUS page for this, we will just link to it.
### CTD (SBE 37SM)
#### Unknown
### Current Meter, ADCP, RDI Long Ranger, 600m range
#### John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
### SeaHorse Profiler (*SSDS ID 1405*): This is a binary format.  I think it is a gzipped set of data for each record, but need to chech with Andy Hamilton about it.  There is XML for it, but we just say binary.
### MBARI Medusa (*SSDS ID 1441*): There is not XML for this and I think this is a new instrument.  We have not seen any data yet, I only see:
{{ERR: Timeout;Timeout;Timeout;retry limit exceeded}}
### ASIMET BPR (*SSDS ID 1443*): There is no XML for this and the data looks like:
{{1025.42 1025.42}}
### Pressure, Barometric, ASIMET (Is this the same as above?)
#### Unknown
### MSP430 (*SSDS ID 1447*): Although this instrument does not have XML specifically, we have seen this many times before.  Data looks like 
{{$PEDATA, P1023.73, T27.63, H43.08, GFL0.00, GFH0.00, C301.46, TC0.00,   * 3688}}
### SOON/PCO2 (*SSDS ID 1448*): Plots of raw data like on CIMT.  QC Processing will run and plots of that data as well. No XML, but we have seen this instrument before.  No data coming yet, we get 
{{ERR: while preparing to sample}}
### Flourometer/Backscatter, Hobielabs HS2 (5000m)
#### Unknown
### Radiometer, Satlantic 350-800nm, Hyperspectral Es(air)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Satlantic 350-800nm, Hyperspectral Ed-w (water, downwelling)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Satlantic 350-800nm, Hyperspectral Lu-w (water, upwelling)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
## MSE Axis BIN Medusa subnode 1 (*SSDS ID 1408*): This one only sends message packets, no data
### MSP430 (*SSDS ID 1411*): This is the same as the MSP430 on other nodes.
### MBARI Medusa (*SSDS ID 1441*): This has no XML and no current data, but I went back a couple days and found data that looks like: 
{{-> channel=0, temp=48.51, vcc=3.2316, txBiasI=3.9796, txPower=0.4652, rxPower=0.0717, status=0x0 channel=3, temp=51.10, vcc=3.2252, txBiasI=4.4665, txPower=0.5313, rxPower=0.1337, status=0x0}}
### Medusa  (*SSDS ID 1485*): Looks like the previous (might have actually replaced that one because it has current data).
{{-> channel=0, temp=51.69, vcc=3.2208, txBiasI=4.2839, txPower=-3.3320, rxPower=-10.6312, status=0x0 channel=3, temp=54.25, vcc=3.2142, txBiasI=4.7679, txPower=-2.7678, rxPower=-8.7681, status=0x0}}
### Digital Camera
#### Thumbnail page of all images from the camera (click on image to get full image)
#### Sounds like images will come back as encapsulated JPG
## CTD (SBE 16+)
#### Plot raw data like on CIMT
#### Process data to calculate salinity
#### Plot salinity along with raw
### Current Meter, ADCP, RDI Sentinel
#### John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
### Current Meter, profiling, Aquadaopp HR Profiler, 6000m
#### This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
### Flourometer/Backscatter, Wetlabs ECO BB2F triplett
#### Unknown, but assuming this would be a similar process that Reiko is running for M0
### Oxygen, Aanderaa
#### Unknown
### Turbidity, Nephalometer, C-star, 6000m
#### Unknown
## MSE Axis BIN Medusa subnode 2 (*SSDS ID 1409*): Again, just message packets.
### MSP430 (*SSDS ID 1413*): Again, another MSP. Nothing new and has current data.
### MBARI Medusa (*SSDS ID 1442*): No current data, but recent data looks like 
{{-> channel=3, temp=49.40, vcc=3.2308, txBiasI=2.6144, txPower=0.5348, rxPower=0.2863, status=0x0}}
### Medusa (*SSDS ID 1486*):
{{-> channel=3, temp=50.25, vcc=3.2476, txBiasI=2.6434, txPower=-2.6995, rxPower=-5.3036, status=0x0}}
### Digital Camera
#### Thumbnail page of all images from the camera (click on image to get full image)
#### Sounds like images will come back as encapsulated JPG
### CTD (SBE 16+)
#### Plot raw data like on CIMT
#### Process data to calculate salinity
#### Plot salinity along with raw
### Current Meter, ADCP, RDI Sentinel
#### John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
### Current Meter, profiling, Aquadaopp HR Profiler, 6000m
#### This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
### Flourometer/Backscatter, Wetlabs ECO BB2F triplett
#### Unknown, but assuming this would be a similar process that Reiko is running for M0
### Oxygen, Aanderaa
#### Unknown
### Turbidity, Nephalometer, C-star, 6000m
#### Unknown
### Vertical Profiler, McLane(FSI velocity, Seapoint OBS, Wetlabs FL, CT&P)
#### Unknown
## Sediment Trap, Honjo
### Unknown
## Sediment Trap, IRS
### Unknown
# Outstanding Issues:
## Instrument questions:
### ASIMET LWR (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
### ASIMET Radiometer, short-wave (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
### ASIMET Relative Humidity and Temperature (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
### ASIMET Wind Speed Direction (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
### Power Can (Ed Mellinger): Any new features/graphs
### Load Cell(Lance McBride): Any processing, any new plots?
### Seahorse(Andy Hamilton): Any processing, feedback or data plots from seahorse?  Any linked images?  Do you want processing and products tracked?
### MBARI Medusa(Mark Chaffey): Do we want plots of any of this data?  Any post processing (and resubmit/track)?
### ASIMET Barometric(Chavez or Ryan): Do plots of raw data make sense?  Any post processing (and resubmit/track)?
### All Satlantic Hyperspectral Radiometers (Chavez/Ryan): What/who is going to do the post processing.  What does it look like and can we feedback/link to the results.
### Digital Camera (Jim Barry, Mark Chaffey): is still an unknown as to what will be returned to SSDS.  Mark sent request to Jim B for requirements from the camera and that will help answer the questions for SSDS.
### CTD (SBE 16+) (Bill Ussler/Doug Conlin): Seabird software was identified as possibly doing the post processing, need to understand process in detail
### ADCP RDI Sentinel (Coenen): What is the post processing for this instrument?  Can we feedback/link data products?
### Aquadopp (Ussler): Contact Leslie to get post processing software.
### Wetlabs ECO BB2F Triplett (Ussler): Follow up to try and get example data to figure out what next steps are
### Aanderaa Oxygen (Barry): Need to follow up to see what the data looks like and what post processing will be done.
### Nephalomter (Ussler): Get details on post processing. Is this a SIAM instrument?
### McLane Profiler(Hamilton): Get any details on post processing and if it is to link back to SSDS.
### Sediment Traps(Chavez): What will the data look like, are we going to put that in SSDS?
## General Issues:
## No decision has been made on MBARI's data policy for this experiment, currently the SSDS team is assuming all data will be open. The public access to data issue was discussed and the next step is to have the scientist's meet to come up with idea of how MSE data should be accessed by the public (if at all) and then give that feedback to the MT for review/approval (note the current default is that data that goes into SSDS is public)
## Documentation in spreadsheet incomplete -- we need to go to each of the reps and collect this data
### Don't know driver writers for many nominally SIAM instruments
## Not sure what the summary/snapshot data (ADCP, OCR, Nortek, Weblabs) will look like and if we are supposed to do anything with it.

h3. Related Data Management Systems and Projects
# [OpenIOOS.org|http://www.openioos.org/index.html]
# [GEON|http://www.geongrid.org]
# [Earth Systems Grid|https://www.earthsystemgrid.org]
# [NOAA's OceanExplorer|http://oceanexplorer.noaa.gov/]
# [GOMOOS|http://www.gomoos.org/]
# [SeaMaven|http://www.seamaven.org/sm.swf]
# [SEACOOS|http://seacoos.org/]
# [The COOL Room|http://www.thecoolroom.org/]
# [EARTH Observations|http://earthobservations.org/]
# [Strategies.org|http://strategies.org/]
# [DAPPER (Look at DAPPER to serve SSDS data)|http://www.epic.noaa.gov/epic/software/dapper/]
# [PACOOS|http://www.pacoos.org/]
# [CENCOOS|http://www.cencoos.org/]
# [EGY|http://egy.org/]
# [OceanSITES|http://www.oceansites.org/OceanSITES/]
# [LDGO|http://ingrid.ldgo.columbia.edu/]
# Christoph Waldman (University of Bremen, Germany) (presented at MBARI on Jan 9, 2006)
## Sensor interoperability and standardisation
## ESONET I and ESONET II + ESONIM, KM2NET, ANTARES, ORION
## He is working on standardized data quality and semantics
## Quality Control: important to always state accuracy
## Using SensorML to describe the sensor and data from sensor (but does not address semantics)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">79</id>
<property name="body"><![CDATA[Requirements documents for SSDS development:

# [CIMT Requirements]
# [MOOS Science Expermiment Requirements|MSERequirements]

h3. Consolidated Requirements

||Number||Requirement||Description||
|1.0|User can merge data from different sources|This should be able to be done by the user selecting variables from various sources and a time frame and then SSDS will return a merged data set in various formats. See John's [pseudo-code|^merge_pseudocode|Pseudo-code for merging] and [Perl script for merging|^merge.pl|Example of perl script for data merging] script.|
|2.0|Data conversions can be done by SSDS|SSDS should support user defined data transformations.  CTD values to salinity is the golden example of this|
|3.0|SSDS should connect up/work with AOSN|?|
|4.0|I want to be able to edit the metadata in the SSDS system.| |
|5.0|I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).| |
|6.0|I want data/plot of variable X (i.e. salinity) from platform Y and time frame.| |
|7.0|I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.| |
|8.0|I want a 'shallow' operational view of current platforms and instruments| |
|9.0|I want to get access to 'all' data from a device| |
|10.0|I want to find all data of mime type X from a device or platform| |
|11.0|I want to see all currently deployed devices in a geospatial location (box)| |
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179754</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212521</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 13:58:50.810</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273151</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA and unzipped it to the C:\bin\jboss-4.2.2GA directory
## I started up JBoss from the command line and noticed that port 8080 had been taken by the SQL services.  I shutdown all SQL services, started JBoss so it could claim those ports, then restarted the SQL components.
# I then installed SmartSVN so that I could get the code from the Google SVN server.
# I started up SmartSVN and added a repository for Google code:
## SVN Location: http://shore-side-data-system.googlecode.com/svn/trunk
## Read only username: shore-side-data-system-read-only
# I checked the code out read-only to a directory with the name of the server (amphisbaena.usc.edu).
# I installed the Flex 4 SDK.
## I downloaded the SDK as a zip file and then extracted it in the c:\bin directory
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797754</id>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830523</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:06:33.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236007</id>
<property name="title"><![CDATA[Debugging Quick Look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268773</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 20:39:26.043</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236009</id>
<property name="title"><![CDATA[Debugging Quick Look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268775</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 20:54:16.663</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">89</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Graphical User Interfaces

h5. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

Here is a list of the GUI/Pages that were developed to meet the user's requirements:

# [Device Inspector]
# [DataContainer Importer]

h3. Programmatic Interfaces (APIs)

h5. Matlab Integration
Users can interact with the SSDS programatically using Matlab.  Instructions for doing this are found on the page [Matlab 2008a Integration].

h3. Other Resources

For a list of other resources used in designing user interfaces to the SSDS, please see [Related Resources]

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035172</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.m88odds.com]]></property>
<property name="title"><![CDATA[m88]]></property>
<property name="blogName"><![CDATA[m88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-18 00:39:11.150</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-18 00:39:11.150</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179736</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212503</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 11:51:19.197</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035173</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.51bodog.com]]></property>
<property name="title"><![CDATA[bodog88]]></property>
<property name="blogName"><![CDATA[bodog88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-18 00:44:45.603</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-18 00:44:45.603</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179735</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212502</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-03-04 10:24:05.763</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179737</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212504</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 12:38:34.497</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766124</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798888</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-11-19 12:27:38.673</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362596</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://wwdc.apple.pro/JessikaKe/tab:info]]></property>
<property name="title"><![CDATA[started]]></property>
<property name="blogName"><![CDATA[started]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-27 16:43:31.050</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-27 16:43:31.050</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388846</id>
<property name="body"><![CDATA[h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the topic that feeds into the TransmogrifyMDB class.  This MDB does some conversions to make sure the incoming messages are in a format SSDS can understand and then republishes them on to the topic that the IngestMDB is listening to.

h5. Ingest Component]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356090</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766094</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798858</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 17:26:20.763</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">630</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">628</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:51:19.793</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179818</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212585</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-02 08:40:21.040</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">634</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">632</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:01:44.170</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388630</id>
<property name="body"><![CDATA[{note:title=This doc has been moved}
Most of the documentation for SSDS should be on the Google code site now and this page is here:
[http://code.google.com/p/shore-side-data-system/wiki/TransmogrifyAndIngest]
{note}

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data


And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">633</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">631</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 08:56:06.213</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179811</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212578</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-08 23:00:46.433</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">632</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">630</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 08:43:12.027</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766095</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798859</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 09:59:45.760</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">631</id>
<property name="title"><![CDATA[ProjectMemosMinutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">629</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-17 10:11:40.717</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797691</id>
<property name="title"><![CDATA[2004-04-20 CIMT SSDS Meeting Notes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830460</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:11:31.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:11:31.037</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179808</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212575</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-03 14:12:38.833</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010507</id>
<property name="destinationPageTitle"><![CDATA[Example of perl script for data merging]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:10:29.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:10:29.877</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388616</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
!Figure 1.jpg|align=centre!

You are looking for the *DeviceQCPlotConfig* table and if you scroll down and right-click on it, then choose 'Open Table->Return all Rows' you will see the listing of all the configurations for creating plots (Figure 2).
!Figure 2.jpg|align=centre!

Here is a list of the columns and what they mean:
* *DeviceID_FK*: This is the SSDS ID of the instrument whose data you want to plot.
* *PacketSubType*: This is the RecordType that contains the variable you want to plot.  Some instruments have more than one type of data they produce. In order to differentiate those, all device data descriptions must specify a RecordType (usually it is a 1, but not always).  You can consult the SSDS web interface ([http://new-ssds.mbari.org]) or the device XML to find what the RecordTypes are.
* *RecordVariable_Name*: This is the short name of the variable you want to plot.
* *NumberOfHoursBack*: This tells the software how far back (in hours) you want to go to grab the data to plot.  It will grab data back that many hours until the current time and create a plot of that data.
* *Chart_Type*: 
* *X_Size*:
* *Y_Size*:
* *X_Axis_Label*:
* *Y_Axis_Label*:
* *Title*:
* *Page_Title*:
* *Page_URL_String*:
* *Image_URL_String*:
* *Data_Page_URL_String*:
* *Y_Max*:
* *Y_Min*:
* *Y_Axis_One_Or_Two*:
* *Use_Long_Variable_Name*:
* *Gps_Show_Anchor*:
* *Gps_Anchor_Latitude*:
* *Gps_Show_Watch_Circle*:
* *Gps_Watch_Circle_Diameter_Km*:
* *Gps_Scale_Chart_To_Fit_Data*:
* *GraphOn*:
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010506</id>
<property name="destinationPageTitle"><![CDATA[Pseudo-code for merging]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:10:29.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:10:29.877</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179810</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212577</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-08 22:28:49.043</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010505</id>
<property name="destinationPageTitle"><![CDATA[MSERequirements]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:10:29.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:10:29.877</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766099</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798863</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 10:00:11.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179809</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212576</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-08 16:20:27.810</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11010504</id>
<property name="destinationPageTitle"><![CDATA[CIMT Requirements]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-28 17:10:29.877</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:10:29.877</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179804</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212571</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-03 13:32:04.027</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179803</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212570</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-03 11:28:30.210</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728688</id>
<property name="fileName"><![CDATA[900027_MOOS_Program_2001.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 09:08:06.593</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:08:06.593</property>
<property name="fileSize">108373</property>
<property name="comment"><![CDATA[2001 MOOS Project Proposal]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797682</id>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830451</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 22:56:40.067</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728689</id>
<property name="fileName"><![CDATA[600125_MOOS_Program_2002.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 09:27:04.053</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:27:04.053</property>
<property name="fileSize">97682</property>
<property name="comment"><![CDATA[2002 MOOS Project Proposal]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179801</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212568</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-02 09:54:49.493</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797679</id>
<property name="title"><![CDATA[ProjectRequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830448</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:13:04.743</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:13:04.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179802</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212569</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-03 11:27:02.483</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766113</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798877</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-14 11:05:34.133</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179795</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212562</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-02 09:05:44.180</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728692</id>
<property name="fileName"><![CDATA[600125_MOOS_abstract_2004.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 10:44:31.347</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 10:44:31.347</property>
<property name="fileSize">129070</property>
<property name="comment"><![CDATA[2004 MOOS Project Proposal]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766114</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798878</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:50:37.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728690</id>
<property name="fileName"><![CDATA[600125_MOOS_Ph_2.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 10:42:59.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 10:42:59.017</property>
<property name="fileSize">20143</property>
<property name="comment"><![CDATA[2002 MOOS Project Proposal Phase 2]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728691</id>
<property name="fileName"><![CDATA[600125_MOOS_Program_2003.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 10:44:13.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 10:44:13.267</property>
<property name="fileSize">363606</property>
<property name="comment"><![CDATA[2003 MOOS Project Proposal]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">637</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">635</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:05:09.093</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728696</id>
<property name="fileName"><![CDATA[2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:16:06.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:16:06.717</property>
<property name="fileSize">225348</property>
<property name="comment"><![CDATA[2002-03-14 SSDS-ISI Interface Meeting Notes]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766118</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798882</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-11-16 11:51:05.710</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">638</id>
<property name="title"><![CDATA[Weekly Notes from January 5, 2006]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">636</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-19 09:03:26.357</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:03:26.357</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">635</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728697</id>
<property name="fileName"><![CDATA[PID286147.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:30:58.147</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:30:58.147</property>
<property name="fileSize">546232</property>
<property name="comment"><![CDATA[2006 Ocean Conference Paper]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797687</id>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830456</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:06:19.537</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179793</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212560</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-08 12:43:33.360</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728694</id>
<property name="fileName"><![CDATA[MOOS_Data_Management_Proposal_2000.pdf]]></property>
<property name="contentType"><![CDATA[application/pdf]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 13:04:41.600</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 13:04:41.600</property>
<property name="fileSize">27461</property>
<property name="comment"><![CDATA[2000 MOOS Data Management Proposal]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766116</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798880</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 16:51:09.757</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">636</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">634</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:02:51.210</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728695</id>
<property name="fileName"><![CDATA[MetadataISIApr2001.ppt]]></property>
<property name="contentType"><![CDATA[application/vnd.ms-powerpoint]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 13:08:08.367</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 13:08:08.367</property>
<property name="fileSize">150528</property>
<property name="comment"><![CDATA[2001 - Standard Metadata and Data Formats]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035224</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.teptded.com/livescore]]></property>
<property name="title"><![CDATA[à¸?à¸¥à¸?à¸­à¸¥]]></property>
<property name="blogName"><![CDATA[à¸?à¸¥à¸?à¸­à¸¥]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-18 19:32:26.217</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-18 19:32:26.217</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797686</id>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830455</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:03:07.417</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766122</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798886</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-11-19 12:12:58.967</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268771</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

h4. A. Initial look at the data

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}\\

h4. B. Tips for debugging with Ferret

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}\\

h4. C. Fixing the start times for all the child instrument deployments

The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for performing mooring turns|O3S:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

h4. D. Examining the gridding method

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.

h4. E. Testing the results of the gridding

It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0040_20101027_original.nc"
plot/symbol=1 temperature[d=3]
plot/ov SEA_WATER_TEMPERATURE_HR[k=4,d=1]

{noformat}
Gives:

 !m1_compare_20.gif|thumbnail!

 !m1_compare_40.gif|thumbnail!

We obviously still have some gridding issues...

h4. F. Rinse and repeat


Now is the time to iterate using our method of starting with the .jnl file that aggregates and grids the data to the OceanSITES \_TS.nc file going back to step D.
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">15728698</id>
<property name="fileName"><![CDATA[SSDS_Oceans_2006.ppt]]></property>
<property name="contentType"><![CDATA[application/vnd.ms-powerpoint]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:31:19.680</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:31:19.680</property>
<property name="fileSize">3736064</property>
<property name="comment"><![CDATA[2006 Oceans Conference Presentation]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9797684</id>
<property name="title"><![CDATA[CIMT Requirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9830453</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:56:40.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 22:58:33.113</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">7766120</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">7798884</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-11-19 11:50:00.027</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179786</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212553</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-29 09:38:28.260</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179785</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212552</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-29 09:25:45.327</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179784</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212551</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-28 16:02:53.613</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179783</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212550</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-27 08:40:04.810</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">25559140</id>
<property name="destinationPageTitle"><![CDATA[BIAUV Image Processing Strategy]]></property>
<property name="destinationSpaceKey"><![CDATA[BIAUV]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2014-03-05 15:53:41.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2014-03-05 15:53:41.237</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362647</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.cisco3750.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-28 21:35:03.633</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-28 21:35:03.633</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">675</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">672</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:36:00.070</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179769</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212536</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-25 15:41:13.700</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">676</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">673</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:48:33.560</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179770</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212537</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-26 10:09:40.853</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">677</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">674</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:52:53.700</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179767</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212534</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-25 15:06:27.580</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">678</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">675</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 14:53:16.220</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">679</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">676</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 16:04:46.740</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236169</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268933</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:21:45.483</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">680</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">677</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 16:20:28.827</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179766</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212533</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-25 14:52:24.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">681</id>
<property name="title"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">678</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-22 14:36:00.070</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-22 16:34:42.050</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179763</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212530</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-25 14:44:00.427</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179759</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212526</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-24 18:31:04.240</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">25559138</id>
<property name="destinationPageTitle"><![CDATA[BIAUV Image Processing Strategy]]></property>
<property name="destinationSpaceKey"><![CDATA[BIAUV]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2014-03-05 15:53:41.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2014-03-05 15:53:41.237</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179760</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212527</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-25 14:06:37.987</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">25559139</id>
<property name="destinationPageTitle"><![CDATA[BIAUV Image Processing Strategy]]></property>
<property name="destinationSpaceKey"><![CDATA[BIAUV]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2014-03-05 15:53:41.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2014-03-05 15:53:41.237</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179757</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212524</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-23 15:39:50.987</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179755</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212522</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 22:57:44.703</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">673</id>
<property name="title"><![CDATA[Project Memos Minutes]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">670</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-17 10:11:40.717</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:05:37.983</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179756</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212523</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 22:58:37.487</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362686</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://lammey.com]]></property>
<property name="title"><![CDATA[silver michael kors bag]]></property>
<property name="blogName"><![CDATA[silver michael kors bag]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-01 12:26:14.290</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-01 12:26:14.290</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1</id>
<property name="fileName"><![CDATA[VarsGmScreenShot.png]]></property>
<property name="contentType"><![CDATA[image/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:59:58.580</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:59:58.580</property>
<property name="fileSize">802702</property>
<property name="comment"><![CDATA[Screen shot of VARS Data Mining]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16416861</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16449624</id>
</element>
</collection>
<property name="version">71</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:11:54.210</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16416860</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16449623</id>
</element>
</collection>
<property name="version">70</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:10:18.367</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236108</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268872</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:09:00.183</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236110</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268874</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:16:41.393</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341548</id>
<property name="destinationPageTitle"><![CDATA[//www.eclipse.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341549</id>
<property name="destinationPageTitle"><![CDATA[//search.cpan.org/~jasons/Class-ObjectTemplate-0.7/]]></property>
<property name="destinationSpaceKey"><![CDATA[(http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035301</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://tr.im/4vrkc]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-19 17:22:52.980</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-19 17:22:52.980</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">17564847</id>
<property name="destinationPageTitle"><![CDATA[April 27, 2010]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-06-09 08:02:11.903</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-09 08:02:11.903</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341540</id>
<property name="destinationPageTitle"><![CDATA[Windows Installation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341541</id>
<property name="destinationPageTitle"><![CDATA[//java.sun.com]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16416858</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16449621</id>
</element>
</collection>
<property name="version">69</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-02-04 16:54:08.397</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341542</id>
<property name="destinationPageTitle"><![CDATA[//ant.apache.org/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362696</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.freebies-freebies.com/index.php?a=stats&u=myrtiseisxd]]></property>
<property name="title"><![CDATA[music]]></property>
<property name="blogName"><![CDATA[music]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-01 15:08:52.033</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-01 15:08:52.033</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341543</id>
<property name="destinationPageTitle"><![CDATA[//localhost/~kgomes/ssdsdata.]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341544</id>
<property name="destinationPageTitle"><![CDATA[//jboss.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341545</id>
<property name="destinationPageTitle"><![CDATA[//localhost:8080]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341546</id>
<property name="destinationPageTitle"><![CDATA[//opensource.adobe.com/wiki/display/flexsdk/Downloads]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11341547</id>
<property name="destinationPageTitle"><![CDATA[//localhost:8080/ssds-docs/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:19:01.290</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 21:19:01.290</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362720</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://onlarcaoyun.com/members/aurorawga/activity/54252/]]></property>
<property name="title"><![CDATA[buju banton]]></property>
<property name="blogName"><![CDATA[buju banton]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-02 00:10:36.140</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-02 00:10:36.140</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236089</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268854</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 09:46:06.803</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">11370504</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.bing.com/search?q=Benthic+Rover&go=&form=QBRE&filt=all&qs=n]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2010-01-17 14:22:15.070</property>
<property name="lastModifierName"/><property name="lastModificationDate">2010-01-17 14:22:15.070</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236087</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268852</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 00:22:00.307</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236085</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268850</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 00:09:14.227</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236083</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268848</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-01 23:56:17.740</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236081</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268846</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-01 23:45:23.557</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236079</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268844</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-01 16:19:54.193</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179829</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212596</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:57:11.780</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388734</id>
<property name="body"><![CDATA[This page describes how you might configure a web application to consume the graphs that are generated by the SSDS.  The way this example is done is by using the Eclipse Java EE Edition to create a web application that allows the user to author pages and deploy them to an application server like Tomcat.

h3. Install Servlet Container
The first thing to do is install a servlet container where your web application will be deployed.  This is most often Tomcat, but can also be something that utilizes Tomcat internally (like JBoss).  For this example, we will download and use JBoss 4.2.2GA.

# Download JBoss from here [http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.2.GA/]
# Unpack the download to where you want to install it, open a command window, and change to the directory where you unpacked the download (where you installed it).
# Start the JBoss server by running run(.sh for Unix and .bat for Windows). Assuming now errors fly by and you get the 'server started in ...' message at the end, Jboss installed successfully.  You can use Cntl-C to stop the server.
# Now download Eclipse JEE 3.5 from here [http://eclipse.org/downloads/] and install it.
# Startup Eclipse after you install it.
# Go to the Workbench view so we can configure a server which will connect to your JBoss installation.
# Click on 'File->New->Other...' and then select 'Server->Server'. Then 'Next>'
# Then select 'JBoss->JBoss v4.2'.  The default server host of 'localhost' and server name of 'JBoss v4.2 on localhost' is fine. Click on 'Next>'.
# You can use the Default JRE and for the 'Application Server Directory' browse to the location where you unpacked JBoss.
{warning:title=Under Construction}
*_September 30, 2009_* this is still under construction
{warning} ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179830</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212597</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 23:00:40.593</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236106</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268870</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:03:41.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179827</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212594</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:42:39.673</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179828</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212595</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:45:02.033</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236104</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268868</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 11:53:29.807</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236102</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268866</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 11:47:59.983</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179831</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212598</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 23:05:08.107</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179832</id>
<property name="title"><![CDATA[2008 Abstract]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212599</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-02 09:05:44.180</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-08 23:02:24.137</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17236100</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17268864</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 09:58:35.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179821</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212588</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 21:09:41.367</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2831</id>
<property name="destinationPageTitle"><![CDATA[//ssdsdevpc:8080/ssds]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">635</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-19 09:14:33.860</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:14:33.860</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179822</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212589</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 21:39:09.287</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179820</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212587</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 20:54:27.637</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179825</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212592</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:22:59.827</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179826</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212593</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:27:04.350</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179823</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212590</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 21:51:05.240</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179824</id>
<property name="title"><![CDATA[2008 Abstract Presentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212591</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-12 20:54:27.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 22:22:21.593</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">2832</id>
<property name="destinationPageTitle"><![CDATA[//eventbus.dev.java.net/]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">635</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-01-19 09:14:33.860</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-01-19 09:14:33.860</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179922</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212687</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-12 20:54:05.123</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777017</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777016</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179921</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212686</id>
</element>
</collection>
<property name="version">44</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 11:10:08.253</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777019</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179920</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212685</id>
</element>
</collection>
<property name="version">43</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 11:08:53.077</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777018</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179919</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212684</id>
</element>
</collection>
<property name="version">42</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 11:08:09.190</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777013</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179918</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212683</id>
</element>
</collection>
<property name="version">41</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 11:00:09.123</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777012</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179917</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212682</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:51:22.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777015</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179916</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212681</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:44:45.747</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777014</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179915</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212680</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:42:25.657</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777025</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777024</id>
<property name="destinationPageTitle"><![CDATA[2008 Abstract]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777027</id>
<property name="destinationPageTitle"><![CDATA[2008 Abstract Presentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777026</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777021</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777020</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777023</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777022</id>
<property name="destinationPageTitle"><![CDATA[//mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.930</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.930</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777032</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777033</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17465507</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17498273</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-09 07:22:14.097</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777034</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777035</id>
<property name="destinationPageTitle"><![CDATA[2011 Proposal Notes]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17465509</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17498275</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-09 07:25:46.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777028</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777029</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777030</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777031</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777040</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from February 2, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777041</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from February 16, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179946</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212711</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-03 07:17:05.643</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17465499</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17498265</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 15:14:35.417</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777042</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 2, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179944</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212709</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-31 11:40:05.770</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777043</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 9, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777036</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17465504</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17498270</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-08 21:23:31.067</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777037</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 5, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777038</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 12, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17465506</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17498272</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-06-09 07:13:36.267</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777039</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from January 26, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777051</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from May 25, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777050</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from May 18, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777049</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 27, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777048</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 21, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777047</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 13, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777046</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from April 6, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777045</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 30, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777044</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from March 23, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777059</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from April 05, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035332</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://freya-rom.de/index.php?option=com_easybookreloaded&controller=entry&Itemid=58&limit90]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-19 20:18:52.013</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-19 20:18:52.013</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777058</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from February 27, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777057</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from February 14, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179898</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212663</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:13:46.880</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777056</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from January 31, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179897</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212662</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-29 09:45:50.690</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777055</id>
<property name="destinationPageTitle"><![CDATA[Mooring Meeting Notes from January 24, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777054</id>
<property name="destinationPageTitle"><![CDATA[OSG Meeting Notes from January 12, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777053</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from June 8, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777052</id>
<property name="destinationPageTitle"><![CDATA[Weekly Notes from June 1, 2006]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777066</id>
<property name="destinationPageTitle"><![CDATA[Ingest Architecture]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179903</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212668</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:27:13.227</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777067</id>
<property name="destinationPageTitle"><![CDATA[Transmogrify and Ingest Deployment]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179904</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212669</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:28:38.697</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777064</id>
<property name="destinationPageTitle"><![CDATA[]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179905</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212670</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:35:00.253</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777065</id>
<property name="destinationPageTitle"><![CDATA[ProjectRequirements]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179906</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212671</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:46:59.240</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777062</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179899</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212664</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:14:08.293</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777063</id>
<property name="destinationPageTitle"><![CDATA[]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179900</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212665</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:21:39.387</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777060</id>
<property name="destinationPageTitle"><![CDATA[MTM_2007_01_17]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179901</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212666</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:22:37.500</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777061</id>
<property name="destinationPageTitle"><![CDATA[SSDS Strategy Meeting on January 22, 2007]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179902</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212667</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:25:36.287</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777074</id>
<property name="destinationPageTitle"><![CDATA[new-ssds.mbari.org Setup]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179911</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212676</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:17:26.760</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777075</id>
<property name="destinationPageTitle"><![CDATA[Installing RabbitMQ (AMQP) on RHEL5]]></property>
<property name="destinationSpaceKey"><![CDATA[SPEPRJ]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179912</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212677</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:23:38.900</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777072</id>
<property name="destinationPageTitle"><![CDATA[Installation and Development]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179913</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212678</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:34:29.257</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777073</id>
<property name="destinationPageTitle"><![CDATA[Migration to Google Code Base]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179914</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212679</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:35:50.347</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777070</id>
<property name="destinationPageTitle"><![CDATA[Data Simulator]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179907</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212672</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:51:45.923</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777071</id>
<property name="destinationPageTitle"><![CDATA[UserInterfaces]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179908</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212673</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 09:59:23.900</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777068</id>
<property name="destinationPageTitle"><![CDATA[Testing TransmogrifyMDB and Ingest]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179909</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212674</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:09:00.180</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777069</id>
<property name="destinationPageTitle"><![CDATA[Services]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179910</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212675</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 10:09:59.160</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">840</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">837</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:42:55.053</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670596</id>
<property name="body"><![CDATA[The idea of this work was to cleanup the build process so that it was very manageable and had a great number of common sense defaults setup so that the property configurations were not difficult.  This would allow for easier installation as well as development.  When I was doing this work, I setup the build so that the user could more easily switch between MySQL and MSSQL.  So a large part of this work over-lapped with the work to get the system ready for opening to the community.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637846</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061034</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093796</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-05 12:55:52.550</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179947</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212712</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-03 08:30:41.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179951</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212716</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-03 06:42:23.637</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179953</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212718</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:27:47.947</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179955</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212720</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:31:35.570</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179958</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212723</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:33:03.210</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179960</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212725</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:37:27.077</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179959</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212724</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:37:06.903</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179961</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212726</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:38:01.030</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">849</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">846</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-08 16:53:29.560</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">850</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">847</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-09 09:28:02.100</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">847</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">844</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-08 15:37:47.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">844</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">841</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-08 12:50:50.907</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777006</id>
<property name="destinationPageTitle"><![CDATA[//www.mbari.org/oasis/qc/index.html]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777007</id>
<property name="destinationPageTitle"><![CDATA[\]]></property>
<property name="destinationSpaceKey"><![CDATA[TS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179974</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212738</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-06 10:56:29.163</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">1179975</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1212739</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-10 10:32:34.560</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777010</id>
<property name="destinationPageTitle"><![CDATA[//ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777011</id>
<property name="destinationPageTitle"><![CDATA[OASIS Mooring turn]]></property>
<property name="destinationSpaceKey"><![CDATA[O3S]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">851</id>
<property name="title"><![CDATA[Developer Docs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">848</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-02-09 09:40:49.467</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777008</id>
<property name="destinationPageTitle"><![CDATA[\]]></property>
<property name="destinationSpaceKey"><![CDATA[TS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777009</id>
<property name="destinationPageTitle"><![CDATA[//moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.853</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.853</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061069</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093832</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 16:24:49.327</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10455990</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2009-06-16 10:34:34.290</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-06-16 10:34:34.290</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061067</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093830</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 16:21:29.827</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10455991</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2009-06-16 10:34:34.290</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-06-16 10:34:34.290</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670672</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

And then a diagram of how they will look after the cleanup:

!After Cleanup Deployment.jpg|thumbnail!

And then the steps on how to make that transition:

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# OK, now with that all cleaned up, I needed to move the existing updatebot, graphing and data checking perl script to the machine
{noformat}
pismo.shore.mbari.org
{noformat}
## Pat was able to construct the same directory structures and permissions on pismo as on predator, so I just copied the files over to /opt/ssds and changed the scripts to point to the correct java locations.
## With the data checking perl script, I changed it to point to the new-ssds GetOriginalDataServlet so that it would be reading the packets from the database and is a much better test as we can see the packets at the database and not just the file system.
# Now with all things moved to pismo, we should be able to change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org instead of to predator.shore.mbari.org.  Pete made that change and I shutdown the jboss (ssds) service and the httpd service on predator.  I also commented out the various mounts in /etc/fstab so that the shares would no longer be mounted on predator.

h3. new-ssds.mbari.org

# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388898</id>
<property name="body"><![CDATA[This is a quick note about how to republish packets from a SIAM Node.  This was taken from and email that Kent Headley sent out after he republished some data to SSDS as well as some help from Bob Herlien.

# Login to the machine where the siam service is running and the log files for the device that you want to republish data from
# type 'gosiam'
# cd to the directory where the data logs are
# Run log publish as per the following example for device 1419
{code}
logPublish -start 1/5/2009T16:10:00 -stop 1/5/2009T18:00 1419 .
{code}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356145</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061044</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093807</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:49:23.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061046</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093809</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:54:42.750</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061048</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093811</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:55:48.500</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061050</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093813</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:58:47.893</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061049</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093812</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:58:22.190</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061036</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093798</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 09:52:46.867</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061038</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093801</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 11:23:10.637</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061040</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093803</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 11:24:49.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061042</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093805</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 11:49:10.303</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061059</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093822</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:21:02.477</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061061</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093824</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:46:35.360</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061063</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093826</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:48:16.837</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061065</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093828</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 14:38:53.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061052</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093815</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 12:59:21.600</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061053</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093816</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:02:04.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">4555174</id>
<property name="destinationPageTitle"><![CDATA[//www.mbari.org/lobo/loboviz.htm]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-05-30 15:57:40.900</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-05-30 15:57:40.900</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">4555175</id>
<property name="destinationPageTitle"><![CDATA[YYYYMM\]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-05-30 15:57:40.900</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-05-30 15:57:40.900</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061055</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093818</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:02:34.200</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">4555176</id>
<property name="destinationPageTitle"><![CDATA[YYYYMM\]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456506</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-05-30 15:57:40.900</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-05-30 15:57:40.900</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8061057</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8093820</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 13:13:12.343</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035463</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://callofdutyblackops2zombiesdownload.blogspot.com/2014/02/call-of-duty-black-ops-2-zombies-free.html]]></property>
<property name="title"><![CDATA[Call Of duty black ops 2 zombies]]></property>
<property name="blogName"><![CDATA[Call Of duty black ops 2 zombies]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-20 19:18:49.553</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-20 19:18:49.553</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664455</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697206</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 12:55:48.177</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664458</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697209</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 15:55:38.070</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664457</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697208</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 13:00:18.180</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13140041</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13172807</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-03-10 22:31:07.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664452</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697203</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 12:45:27.993</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664453</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697204</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 12:48:58.703</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664448</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697199</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 11:48:04.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664450</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697201</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 12:42:39.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362438</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://24dignews.com/story.php?title=piratebay-gedeblokkeerd]]></property>
<property name="title"><![CDATA[pirate proxy]]></property>
<property name="blogName"><![CDATA[pirate proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-25 10:33:37.717</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-25 10:33:37.717</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664444</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697195</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 11:10:49.670</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664446</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697197</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 11:24:23.533</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664440</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697191</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 10:01:32.777</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664442</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697193</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 10:50:27.340</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035572</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.bbsgweddings.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-23 03:24:20.880</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-23 03:24:20.880</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664438</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697189</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 09:39:57.047</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664434</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697185</id>
</element>
</collection>
<property name="version">50</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:57:15.503</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">13860906</id>
<property name="fileName"><![CDATA[Data_Security_for_SSDS.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-01 06:19:32.023</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-01 06:19:32.023</property>
<property name="fileSize">32256</property>
<property name="comment"><![CDATA[Abstract for Security Work for 2011]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664489</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697240</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-30 09:44:03.207</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035511</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://casino.ghbet.com]]></property>
<property name="title"><![CDATA[à¸?à¸²à¸ªà¸´à¹?à¸?à¸­à¸­à¸?à¹?à¸¥à¸?à¹?]]></property>
<property name="blogName"><![CDATA[à¸?à¸²à¸ªà¸´à¹?à¸?à¸­à¸­à¸?à¹?à¸¥à¸?à¹?]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-21 07:44:53.650</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-21 07:44:53.650</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13140051</id>
<property name="title"><![CDATA[Transmogrify and Ingest Deployment]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13172817</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 13:08:50.467</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:18:47.140</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356090</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13140045</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13172811</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:00:17.540</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664462</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697213</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-30 08:06:10.560</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13140043</id>
<property name="title"><![CDATA[Windows Installation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13172809</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-03-10 21:41:49.343</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 16:46:26.960</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">13664460</id>
<property name="title"><![CDATA[new-ssds.mbari.org Setup]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13697211</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-29 09:39:57.047</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-29 15:56:51.497</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362938</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jollawalls.com/profile/wvcbarrett]]></property>
<property name="title"><![CDATA[venus factor]]></property>
<property name="blogName"><![CDATA[venus factor]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-04 17:44:20.993</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-04 17:44:20.993</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">9928756</id>
<property name="fileName"><![CDATA[merge_pseudocode]]></property>
<property name="contentType"><![CDATA[application/octet-stream]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-05-06 08:24:26.333</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-05-06 08:24:26.333</property>
<property name="fileSize">3483</property>
<property name="comment"><![CDATA[Document with psuedo code for merging data in SSDS]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">9928757</id>
<property name="fileName"><![CDATA[merge.pl]]></property>
<property name="contentType"><![CDATA[text/plain]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-05-06 08:24:46.723</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-05-06 08:24:46.723</property>
<property name="fileSize">19851</property>
<property name="comment"><![CDATA[John's perl script that he wrote for merging data]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461972</id>
<property name="destinationPageTitle"><![CDATA[//xerces.apache.org/xerces-c/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362957</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.prodigyanesthesia.com]]></property>
<property name="title"><![CDATA[cheap men christian louboutin shoes]]></property>
<property name="blogName"><![CDATA[cheap men christian louboutin shoes]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-05 00:40:44.370</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-05 00:40:44.370</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461973</id>
<property name="destinationPageTitle"><![CDATA[//sourceforge.net/projects/xqilla/files/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355892</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388659</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 12:15:09.700</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">633</id>
<property name="body"><![CDATA[h1. Weekly Meeting Agenda
h2. Updates Around The Table
h3. Mike M
# New HOOVES/RCP
** Struggling, but progress.
** org.mbari.hooves in own CVS project "hooves"
** Data binding framework that allowed model object to be used in forms.  Adding listener support for property changes.
** So overall, RCP is going well.
** HOOVES will be on hold for a bit for M0 data.
# DTS Job to copy data from old architecture to new.
** Asking Neil to port that to a DTC job on Fog (Kevin needs to follow up with Neil, DTS jobs broken)
*** Look in master script for server polyp.
# M0 data request/more data processing
** Will be impacted by meeting tomorrow.
** Request is to access data from anytime period.
** These are the post processed data sets.
** Will meet with Reiko
** Needs Andrew's work on the auto Perl module and will bite the bullet and go with new architecture.
** Told John R about a week.
** Notifications are enabled by listener properties, but does not address remote clients.
** This could be based on a message bus architecture. dev.java.net project called event bus.

h3. Andrew
# ACE update
** Kent and Tom and list of to dos and pretty much done.  Waiting on them.  Still issue with tracking jars and how to deal with them.  Not currently working on it.
# XML Editor
** Fallen by the wayside. Needing time to work on. Pick back up after architecture roll out.
# Caress data
** Half way finished, will finish on contingency time.  Will do after perl module.
** Front end is done, Google maps with our bathymetry.  Will need to sit down and go over to make sure it can extend.
# ANTLR
** General parser that gives SSDS code parse tree.  Then generate perl modules. Moving into the SSDS code base. Other languages will probably be fairly straightforward.
# Benthic Rover Data Management
** In conception right now.
** Data should be showing up in mid 2006.

h3. John
# M1 Turnaround status
** Waiting on the new architecture before changing.
** M0 puck needs to be reburned.
# We need to check to see if Paul has already re-burned the PUCK (yes, they have)
** Tomorrows meeting:
** Meet with John at 8:00 tomorrow.
# JSF/Web app flow (This is back to John)
** Mike SWT components should be able to be exported to web pages.
** Getting up and running on development environment, then focus on JSF.
# Documentation Status
** Nothing but with JSF discussion
# NSF Proposal (likely to pull John off SSDS till February)
** Not going forward, John back on SSDS.
  
h3. Luis
# MMI status
** Finished final workshop report.
** SSDS problems with services (no progess).
  
h3. Mike G
# ASAP Data Systems Update

h3. Kevin
# SSDS Hours/Project Plan update
** 2005
*** 320 allocated for core and we were 43 days over, if you adjust out 60 days MMI time, we were under by 17.
*** As a project we were over by 87 days (billable to SSDS)), if you adjust out 60 days MMI time, we were over by 27.
**** Kevin (144 allocated, spent 156: 12+)
**** John (90 allocated, spent 114: 24+) This is not correct, 60 days went against MMI
**** Andrew (82 allocated, spent 93: 11+)
**** Mike (36 days)
**** Nancy Barr (3 days)
**** Rich (3 days)
**** Dorothy (13 days)
**** Karen (4 days)
*** 2006 Allocations
**** Kevin: 126 days
**** John: 40 days <b><i>(is this correct?)</i></b>
**** Andrew: 20 days
# Need project schedule for 2006(this week)
# Development
** General
*** New machine order HP dual athalon with Red Hat
**** Need to draft up deployment and migration scenario for new architecture/new machine
*** Web Application
**** Sputtering to life ([http://ssdsdevpc:8080/ssds])
*** Core Metadata
*** Core Data
*** Clients
*** Model Integration
# MSE
*** Need to document requirements for data access (by tomorrow!)
*** No update on data policy
# ASAP
*** Need to meet with Mike G to discuss schema changes.

h2. Action Items
# Getting new architecture rolled out is critical (time wise)
# Finish up DTS job migration
# Get project plan done and identify tasks for developers
# Look at [eventbus:|https://eventbus.dev.java.net/] as possible solution for remote model object notificaton (and other SSDS stuff).
# Finish getting John's development environment going
# Get ASAP update from Mike G.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">635</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355896</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388661</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-07 14:15:10.550</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355885</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388652</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 12:16:39.707</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5505494</id>
<property name="destinationPageTitle"><![CDATA[~mccann]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374184</id>
</property>
<property name="creatorName"><![CDATA[brian]]></property>
<property name="creationDate">2008-06-17 16:50:54.140</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-06-17 16:50:54.140</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162890</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195656</id>
</element>
</collection>
<property name="version">46</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-11-14 00:23:32.773</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162889</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195655</id>
</element>
</collection>
<property name="version">45</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-31 11:22:17.230</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913100</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945860</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 11:06:33.383</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162893</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195659</id>
</element>
</collection>
<property name="version">49</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-11-14 06:45:14.453</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162891</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195657</id>
</element>
</collection>
<property name="version">47</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-11-14 00:24:13.560</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162892</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195658</id>
</element>
</collection>
<property name="version">48</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-11-14 06:43:53.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">594</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461971</id>
<property name="destinationPageTitle"><![CDATA[//www.graphviz.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461970</id>
<property name="destinationPageTitle"><![CDATA[//ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461969</id>
<property name="destinationPageTitle"><![CDATA[//www.apache.org/dist/qpid/0.5/qpid-0.5.tar.gz]]></property>
<property name="destinationSpaceKey"><![CDATA[(http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461968</id>
<property name="destinationPageTitle"><![CDATA[//qpid.apache.org/download.html]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-07 22:55:32.257</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 22:55:32.257</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">9928709</id>
<property name="fileName"><![CDATA[Data_Processing_Analysis.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 23:02:09.957</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 23:02:09.957</property>
<property name="fileSize">48640</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035000</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.udelascienciasyelarte.Ac.cr/index.php?option=com_blog&view=comments&pid=100237&Itemid=0]]></property>
<property name="title"><![CDATA[mÃ¡y Ã©p trÃ¡i cÃ¢y kuvings]]></property>
<property name="blogName"><![CDATA[mÃ¡y Ã©p trÃ¡i cÃ¢y kuvings]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - graybeal, john - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-16 00:10:42.493</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-16 00:10:42.493</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">9928708</id>
<property name="fileName"><![CDATA[Mooring_Quality_Contr#F4B3C.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-14 22:57:42.137</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 22:57:42.137</property>
<property name="fileSize">37376</property>
<property name="comment"><![CDATA[Mooring QC Plot Requirements]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">595</id>
<property name="body"><![CDATA[* SSDS tasks for April is to set up the data processing for Vertical Profiler (McLane)
* Andy is not available for any work.  Hmmm ... we need Andy to help setup the processing
* December we will be replacing the Axis BIN.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">597</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">9928713</id>
<property name="fileName"><![CDATA[Mooring_QC-QL_plots.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-04-17 08:25:33.317</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-17 08:25:33.317</property>
<property name="fileSize">40448</property>
<property name="comment"><![CDATA[This was done by Reiko and then John G added categories in this version to organize]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25035010</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.msn-fun.com/forum/profile.php?id=252701]]></property>
<property name="title"><![CDATA[visite site]]></property>
<property name="blogName"><![CDATA[visite site]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-16 02:55:20.547</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-16 02:55:20.547</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355678</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388406</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 08:55:08.283</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034983</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://michaelilevine.info]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-15 17:19:05.567</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-15 17:19:05.567</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355676</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388404</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 00:47:38.683</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913010</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945773</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 14:26:13.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355682</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388410</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 09:18:21.800</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953636</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jiffylubeoilchangeprice.tumblr.com/]]></property>
<property name="title"><![CDATA[http://jiffylubeoilchangeprice.tumblr.com/]]></property>
<property name="blogName"><![CDATA[http://jiffylubeoilchangeprice.tumblr.com/]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-24 07:12:10.790</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-24 07:12:10.790</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355680</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388408</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 09:05:00.567</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913006</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945769</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-08-13 13:01:28.710</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5406932</id>
<property name="body"><![CDATA[From [~mccann]:

{quote}
I thought I'd share this little bit of success.  

With Matlab 2008a on Windows we are able to interact with SSDS Metadata via the client jar file.
The path to the jar file does need to be added to Matlab's static javaclasspath.  Do this by 
adding the path to the jar file to C:\Program Files\MATLAB\R2008a\toolbox\local\classpth.txt,
e.g. '$matlabroot/work/java/ssds-services-metadata-client-new-ssds.jar'.  Then restart Matlab.

Here's some example commands:
{code}
% Import SSDS package
import moos.ssds.services.metadata.*

% Get Home interface
home = moos.ssds.services.metadata.DataProducerAccessUtil.getHome();

% Get Access object
dpAccess = home.create();

% Call methods on the Access object
dpAccess.countFindParentlessDeployments
dpAccess.countFindByName('Back', logical(0))

% Get a specific instrument deployment and print out some properties
dList = dpAccess.findByName( ...
        'Backscatterometer (2006-10-17T00:53:30Z - 8) UUID=edb274f1-9277-11da-a72b-0800200c9a66', ...
        logical(1), 'id', 'ascending', logical(1));
it = dList.iterator;
d = it.next;
d.getName
d.getStartDate
d.getDevice.getMfgSerialNumber
{code}

(You may ignore the FileNotFoundException for \opt\ssds\logs\ssds-client.log - Kevin says he'll fix that.)
{quote}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374184</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913016</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945779</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 09:17:27.130</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355684</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388412</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 10:28:32.150</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913017</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945780</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 09:22:32.020</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355689</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388417</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-03 00:36:56.900</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913012</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945775</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 08:41:28.837</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355687</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388415</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-01 10:33:39.123</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913014</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945777</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 09:16:23.360</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913019</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945782</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 09:23:30.033</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355670</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388398</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-07-31 17:09:55.113</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953641</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://mrdavidson.blog.fc2.com]]></property>
<property name="title"><![CDATA[discover this info here]]></property>
<property name="blogName"><![CDATA[discover this info here]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-25 06:11:39.347</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-25 06:11:39.347</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355668</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388396</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-07-31 11:41:34.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355674</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388402</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-07-31 17:34:09.687</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913027</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945790</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 09:26:18.490</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355672</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388400</id>
</element>
</collection>
<collection name="referralLinks"><element class="ReferralLink" package="com.atlassian.confluence.links"><id name="id">10322085</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-07-31 17:21:25.367</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953643</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://1bookmarks.net/user.php?login=malindalu&]]></property>
<property name="title"><![CDATA[title the pirate bay movies title]]></property>
<property name="blogName"><![CDATA[title the pirate bay movies title]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-25 18:02:53.733</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-25 18:02:53.733</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8913029</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945792</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-23 11:04:21.910</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162835</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195601</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-08-10 10:34:35.710</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362913</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://Www.Plataformaaurea.cl/content/view/444265/Viviendo-los-5-Ritmos.html]]></property>
<property name="title"><![CDATA[small business loans dc]]></property>
<property name="blogName"><![CDATA[small business loans dc]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-04 10:59:52.353</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-04 10:59:52.353</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162836</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195602</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-10-29 10:50:52.960</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362915</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.whererootsandwingsentwine.com/2013/09/missing-mamgu.html]]></property>
<property name="title"><![CDATA[why not look here]]></property>
<property name="blogName"><![CDATA[why not look here]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-04 11:02:06.210</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-04 11:02:06.210</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355864</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388631</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 12:16:17.787</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">6226616</id>
<property name="body"><![CDATA[Well, after a bit of a break, I am cranking back up on SSDS Development with a push to get a bunch of features developed by year's end.]]></property>
<property name="content" class="BlogPost" package="com.atlassian.confluence.pages"><id name="id">6259415</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355860</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388627</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-12-30 13:29:30.727</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355859</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388626</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-12-30 13:12:33.063</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355861</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388628</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 11:25:42.127</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355857</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388624</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-11-18 17:14:54.440</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953610</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.kwerps.net/buy-instagram-followers/]]></property>
<property name="title"><![CDATA[buy instagram likes]]></property>
<property name="blogName"><![CDATA[buy instagram likes]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-21 09:58:15.153</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-21 09:58:15.153</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3114484</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3179956</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-10-29 10:52:13.487</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034947</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.m88day.com]]></property>
<property name="title"><![CDATA[m88]]></property>
<property name="blogName"><![CDATA[m88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-15 03:02:28.240</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-20 03:46:03.290</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362820</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.humanresilience.com/home/blog/904-resilience-news/175-paralympic-games.html]]></property>
<property name="title"><![CDATA[working capital loan small business]]></property>
<property name="blogName"><![CDATA[working capital loan small business]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 11:00:30.913</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 11:00:30.913</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362816</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://freegamesplay.eu/groups/small-business-administration-sba-loans/]]></property>
<property name="title"><![CDATA[business financing mississauga]]></property>
<property name="blogName"><![CDATA[business financing mississauga]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 08:50:44.833</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 08:50:44.833</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362815</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.mgokdemir.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 08:30:28.017</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 08:30:28.017</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013716</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/clients/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">92</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">90</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:49:36.650</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362813</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://bagpipesofkintail.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 08:08:08.560</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 08:08:08.560</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953573</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://marchenordique-befit.fr/2013/07/21/qu%e2%80%99est-ce-que-la-marche-nordique/]]></property>
<property name="title"><![CDATA[sneak a peek at this web-site.]]></property>
<property name="blogName"><![CDATA[sneak a peek at this web-site.]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-16 00:55:27.413</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-16 00:55:27.413</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013717</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1540129</id>
<property name="fileName"><![CDATA[SSDS_Hardening_WBS-1.xls]]></property>
<property name="contentType"><![CDATA[application/vnd.ms-excel]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-31 11:38:47.267</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-31 11:38:47.267</property>
<property name="fileSize">15360</property>
<property name="comment"><![CDATA[Work Breakdown Structure]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013718</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">94</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">92</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:55:57.813</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013719</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/rawpackets/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">93</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">91</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:55:15.150</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013720</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/rss/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362809</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.online-gambling-top-sites.com/index.php?a=stats&u=elsaeichmann]]></property>
<property name="title"><![CDATA[business loan paid]]></property>
<property name="blogName"><![CDATA[business loan paid]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Graybeal, John - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 07:04:22.133</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 07:04:22.133</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013721</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/transmogrify/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013722</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/xml/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013723</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org/data]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">83</id>
<property name="title"><![CDATA[MSERequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">81</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:18:56.927</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:18:56.927</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356013</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388774</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 21:32:04.073</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">84</id>
<property name="title"><![CDATA[MSERequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">82</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:18:56.927</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:25:15.973</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">85</id>
<property name="title"><![CDATA[MSERequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">83</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:18:56.927</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:32:54.277</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">82</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">86</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">84</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:05:39.850</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356012</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388773</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 21:26:20.673</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">87</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">85</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:43:49.193</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356017</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388778</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 22:23:00.147</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">88</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">86</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:50:34.460</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356018</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388779</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-08 11:37:49.700</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953576</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://mario-metzler.patty-shop.de/]]></property>
<property name="title"><![CDATA[proxy kat]]></property>
<property name="blogName"><![CDATA[proxy kat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-18 00:41:01.147</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-18 00:41:01.147</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">89</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">87</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 15:12:15.247</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953575</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.vodafonemalta.com/__media__/js/netsoltrademark.php?d=proxybay.net]]></property>
<property name="title"><![CDATA[the pirate bay english]]></property>
<property name="blogName"><![CDATA[the pirate bay english]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-18 00:05:47.887</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-18 00:05:47.887</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356015</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388776</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 21:41:56.140</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">90</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">88</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:42:02.113</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034912</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.helpfortaxes.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-14 12:59:30.450</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-14 12:59:30.450</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953574</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.betheln.com/index.php?mid=set3_3&document_srl=54810]]></property>
<property name="title"><![CDATA[visit here]]></property>
<property name="blogName"><![CDATA[visit here]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-16 16:51:44.137</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-16 16:51:44.137</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">75</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">73</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 18:54:24.920</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">76</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">74</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 14:27:00.763</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">77</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">75</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 14:27:59.163</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034909</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.mensinger2012.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-14 11:44:03.380</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-14 11:44:03.380</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">78</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">76</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 14:29:12.727</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356020</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388781</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-10 19:51:29.610</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034908</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://18911newhampshireavenue.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-14 10:22:56.030</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-14 10:22:56.030</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">79</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">77</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 14:44:48.867</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953584</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.domainhome.net/whois/bayproxy.me/]]></property>
<property name="title"><![CDATA[tpb,]]></property>
<property name="blogName"><![CDATA[tpb,]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-18 23:44:46.330</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-18 23:44:46.330</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034905</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.springuniversal.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[benthic rover data management - confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-14 09:46:52.250</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-14 09:46:52.250</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356060</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388819</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 10:46:50.527</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912981</id>
<property name="title"><![CDATA[Data Producer Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945745</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:35:49.373</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:36:38.853</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912969</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356062</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388821</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:03:29.790</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912979</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945743</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:38:47.420</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356064</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388823</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:08:42.127</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912985</id>
<property name="title"><![CDATA[Data Producer Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945749</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:35:49.373</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:40:23.453</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912969</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013699</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356065</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388824</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:12:46.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912983</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945747</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:39:04.507</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356068</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388827</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:13:21.357</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">62</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">60</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 16:34:58.057</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912974</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945738</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:36:28.997</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912973</id>
<property name="title"><![CDATA[Data Producer Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945737</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:35:49.373</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:35:49.373</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912969</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">61</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">59</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 16:17:16.570</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356070</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388829</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:23:58.610</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">60</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">58</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 16:13:06.350</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912972</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945736</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-21 14:18:00.547</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356072</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388831</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:29:56.313</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912978</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945742</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:38:25.297</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9798261</id>
<property name="title"><![CDATA[ProjectRequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9831014</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:13:04.743</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-05-06 08:23:54.810</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912977</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945741</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:37:05.430</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9798260</id>
<property name="title"><![CDATA[ProjectRequirements]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9831013</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:13:04.743</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-04-14 22:55:24.080</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">81</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">64</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">62</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 18:54:10.637</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912975</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945739</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-22 10:36:03.900</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">63</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">61</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 16:37:27.920</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013711</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/rawpackets/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777082</id>
<property name="destinationPageTitle"><![CDATA[How to Configure Graphs]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013710</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777083</id>
<property name="destinationPageTitle"><![CDATA[An example use of Graphs - FOCE]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013709</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777080</id>
<property name="destinationPageTitle"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1540118</id>
<property name="fileName"><![CDATA[SSDS_Hardening_2008.ppt]]></property>
<property name="contentType"><![CDATA[application/vnd.ms-powerpoint]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179819</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-13 00:06:28.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-13 00:06:28.787</property>
<property name="fileSize">5211648</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013708</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/clients/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777081</id>
<property name="destinationPageTitle"><![CDATA[Analyzing signals from MARS using SSDS and Matlab]]></property>
<property name="destinationSpaceKey"><![CDATA[OneStopShopping]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630761</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663518</id>
</element>
</collection>
<property name="version">58</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:27:33.563</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013715</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/auvctd/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777078</id>
<property name="destinationPageTitle"><![CDATA[OASIS Mooring turn]]></property>
<property name="destinationSpaceKey"><![CDATA[O3S]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">57</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">55</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:08:21.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013714</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/xml/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777079</id>
<property name="destinationPageTitle"><![CDATA[Republishing Data From SIAM Node]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630755</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663512</id>
</element>
</collection>
<property name="version">55</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:08:53.823</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">58</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">56</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 15:15:26.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013713</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/transmogrify/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777076</id>
<property name="destinationPageTitle"><![CDATA[OASIS Mooring Data Processing Overview]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630758</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663515</id>
</element>
</collection>
<property name="version">57</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:11:12.517</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013712</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/ssds/rss/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777077</id>
<property name="destinationPageTitle"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630757</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663514</id>
</element>
</collection>
<property name="version">56</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 09:09:59.457</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013703</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355440</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388171</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 17:53:13.377</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013702</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013701</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/data/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356053</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388812</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 22:26:43.720</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1540110</id>
<property name="fileName"><![CDATA[SSDS_DM_Improvements_2008.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-07-08 23:06:12.750</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-07-08 23:06:12.750</property>
<property name="fileSize">30720</property>
<property name="comment"><![CDATA[Abstract in Word form]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777088</id>
<property name="destinationPageTitle"><![CDATA[NREL]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">43</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">41</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:07:24.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013700</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/clients/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777089</id>
<property name="destinationPageTitle"><![CDATA[SRVI]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630753</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663510</id>
</element>
</collection>
<property name="version">54</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-11-08 10:38:32.500</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">44</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">42</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:07:38.577</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013707</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/auvctd/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356055</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388814</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 10:39:19.290</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355436</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388167</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 17:17:13.980</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777086</id>
<property name="destinationPageTitle"><![CDATA[USC]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013706</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777087</id>
<property name="destinationPageTitle"><![CDATA[ALOHA]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013705</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355438</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388169</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 17:25:03.067</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1540114</id>
<property name="fileName"><![CDATA[SSDS_Hardening_2008.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-09 13:05:07.270</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-09 13:05:47.520</property>
<property name="fileSize">31744</property>
<property name="comment"><![CDATA[Revised abstract]]></property>
<property name="attachmentVersion">2</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777084</id>
<property name="destinationPageTitle"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">5013704</id>
<property name="destinationPageTitle"><![CDATA[//ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-09 09:36:21.913</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:21.913</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">1540115</id>
<property name="fileName"><![CDATA[SSDS_Hardening_2008.doc]]></property>
<property name="contentType"><![CDATA[application/msword]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2007-07-09 13:05:07.270</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-07-09 13:05:07.270</property>
<property name="fileSize">31744</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">1540114</id>
</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">18777085</id>
<property name="destinationPageTitle"><![CDATA[SQL 2008 Upgrade and Move to Dione]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-02-03 09:16:05.933</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-02-03 09:16:05.933</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">40</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">38</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:05:46.927</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">39</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">37</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:04:03.480</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">41</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">39</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:06:58.947</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">36</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">34</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 14:02:01.120</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">35</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">33</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:54:11.407</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630775</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663532</id>
</element>
</collection>
<property name="version">60</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 10:45:21.417</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953504</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://Www.moopzoopfever.com/]]></property>
<property name="title"><![CDATA[not fake]]></property>
<property name="blogName"><![CDATA[not fake]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-13 11:02:37.427</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-13 11:02:37.427</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">32</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">30</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:52:27.157</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">31</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">29</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:50:06.967</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630763</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663520</id>
</element>
</collection>
<property name="version">59</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 10:43:30.713</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">34</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">32</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:52:44.777</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">28</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">26</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:49:26.923</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">27</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">25</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 13:46:54.087</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355953</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388717</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-07 14:16:57.980</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">25</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">23</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 23:51:33.733</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">13</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 23:19:16.707</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630781</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663538</id>
</element>
</collection>
<property name="version">62</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 13:06:50.507</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">14</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 23:44:45.700</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 23:45:01.610</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630779</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663536</id>
</element>
</collection>
<property name="version">61</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 13:04:14.027</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362765</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://bobby257.edublogs.org/mca]]></property>
<property name="title"><![CDATA[i was reading this]]></property>
<property name="blogName"><![CDATA[i was reading this]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-02 14:05:14.930</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-02 14:05:14.930</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953524</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.moopzoopfever.com]]></property>
<property name="title"><![CDATA[not fake]]></property>
<property name="blogName"><![CDATA[not fake]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-14 01:39:06.730</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-14 01:39:06.730</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">5046287</id>
<property name="fileName"><![CDATA[After Cleanup Deployment.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-16 13:41:42.110</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-16 13:41:42.110</property>
<property name="fileSize">313667</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">3735622</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">14</id>
<property name="title"><![CDATA[Home]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">12</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.643</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13434989</id>
<property name="destinationPageTitle"><![CDATA[Related Resources]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 08:49:22.777</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.777</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953462</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://jyhshin.pixnet.net/blog/post/39399725-build-transmission-2.77-for-mips]]></property>
<property name="title"><![CDATA[torrente 4 torrent]]></property>
<property name="blogName"><![CDATA[torrente 4 torrent]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-30 10:41:44.657</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-30 10:41:44.657</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630803</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663560</id>
</element>
</collection>
<property name="version">66</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.820</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706105</id>
<property name="destinationPageTitle"><![CDATA[Tasks]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912922</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945689</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-15 12:54:52.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13434988</id>
<property name="destinationPageTitle"><![CDATA[Matlab 2008a Integration]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 08:49:22.777</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.777</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355999</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388760</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:51:15.420</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">22020097</id>
<property name="viewCount">519</property>
<property name="url"><![CDATA[https://oceana.mbari.org/]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-02 16:29:15.080</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-05 14:26:15.030</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953463</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://fosterparents.com/fpgeneral/profile.php?mode=viewprofile&u=121685]]></property>
<property name="title"><![CDATA[proxy kat]]></property>
<property name="blogName"><![CDATA[proxy kat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-30 21:33:47.133</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-30 21:33:47.133</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630804</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663561</id>
</element>
</collection>
<property name="version">67</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:22:30.790</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706104</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953464</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://smartsolutions123.com/read_blog/1360/painless-methods-for-the-pirate-bay-proxy-across-the-uk]]></property>
<property name="title"><![CDATA[torrentspy music directory]]></property>
<property name="blogName"><![CDATA[torrentspy music directory]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-31 20:42:07.960</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-31 20:42:07.960</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630805</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663562</id>
</element>
</collection>
<property name="version">68</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:22:49.203</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706107</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356001</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388762</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 14:19:17.147</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953465</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://202.63.113.200/drupal6/content/options-effective-products-torrent]]></property>
<property name="title"><![CDATA[vpn]]></property>
<property name="blogName"><![CDATA[vpn]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-01 07:21:19.433</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-01 07:21:19.433</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706106</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org:8080/cimt/cimt.jsp]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953466</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://Proxybay.net/]]></property>
<property name="title"><![CDATA[More suggestions]]></property>
<property name="blogName"><![CDATA[More suggestions]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-02 21:51:00.617</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-02 21:51:00.617</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630807</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663564</id>
</element>
</collection>
<property name="version">69</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:23:37.350</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706101</id>
<property name="destinationPageTitle"><![CDATA[SSDS Project Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.810</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.810</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355995</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388756</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 12:54:40.853</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953467</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://iwanatalk.com/?p=43751]]></property>
<property name="title"><![CDATA[torrential tribute vs starlight road]]></property>
<property name="blogName"><![CDATA[torrential tribute vs starlight road]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-03 08:08:05.860</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-03 08:08:05.860</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706100</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.810</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.810</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953468</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://freischuetz-pflaumheim.de/2012/10/06/einladung-fur-das-lakefleischessen-unserer-freunde-aus-grosheubach/]]></property>
<property name="title"><![CDATA[kat proxy]]></property>
<property name="blogName"><![CDATA[kat proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-04 00:55:57.420</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-04 00:55:57.420</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630809</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663566</id>
</element>
</collection>
<property name="version">70</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:27:54.043</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706103</id>
<property name="destinationPageTitle"><![CDATA[//alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355997</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388758</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:41:21.740</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953469</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.eneoa.org/profile/45234/KindraI80]]></property>
<property name="title"><![CDATA[pirate bay Proxy]]></property>
<property name="blogName"><![CDATA[pirate bay Proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-09 19:09:46.223</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-09 19:09:46.223</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706102</id>
<property name="destinationPageTitle"><![CDATA[Project Memos Minutes]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.810</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.810</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356008</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388769</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:20:29.863</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953470</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.wealthavenue.net/index.php?do=/blog/26666/straightforward-torrent-programs-what-039-s-needed/]]></property>
<property name="title"><![CDATA[anonymous proxy]]></property>
<property name="blogName"><![CDATA[anonymous proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-12 06:17:04.203</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-12 06:17:04.203</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356007</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388768</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:20:11.603</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630796</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663553</id>
</element>
</collection>
<property name="version">63</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 13:10:03.943</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356010</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388771</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:21:30.987</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630798</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663555</id>
</element>
</collection>
<property name="version">64</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:15:29.713</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13434985</id>
<property name="destinationPageTitle"><![CDATA[RIA Technologies for the SSDS]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 08:49:22.773</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.773</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356004</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388765</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:12:30.300</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356003</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388764</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:04:08.480</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">15706108</id>
<property name="destinationPageTitle"><![CDATA[//oceana.mbari.org/jira/browse/SSDS]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-01-05 15:20:04.813</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:20:04.813</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630800</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663557</id>
</element>
</collection>
<property name="version">46</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:46.277</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13434987</id>
<property name="destinationPageTitle"><![CDATA[DataContainer Importer]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 08:49:22.777</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.777</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356006</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388767</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 16:14:41.333</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630801</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663558</id>
</element>
</collection>
<property name="version">65</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:16:48.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13434986</id>
<property name="destinationPageTitle"><![CDATA[Device Inspector]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-09 08:49:22.773</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-09 08:49:22.773</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355983</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388744</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-08 16:16:54.793</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25362798</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.jlptechnologies.com]]></property>
<property name="title"><![CDATA[michael kors factory outlet online sale]]></property>
<property name="blogName"><![CDATA[michael kors factory outlet online sale]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-03 03:33:45.370</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-03 03:33:45.370</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355985</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388746</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 09:11:55.607</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355986</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388747</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 09:14:07.600</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">671</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
### Funded another year (June 2008)
## AUVCTD
## Post processing of all of the above
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
### Post processing of profiler data
### Metadata and other user interfaces
#### HOOVES and metadata editing
### Camera integration (data stream)
### Watch circle alarm
### Processes and procedures development (metadata is inconsistent) on MSE - operations
### Andrew's ACE stuff (Tom) User interface and business logic.
## OASIS
### M! Turn
### M2 Turn
### NDBC Cleanup (CIMT mooring)
### Ops procedures and people/tools/training (XML and turns)
## CIMT
### 2 turns (?)
## AUVCTD
### ssdsLoads is broken
### HOOVES
## SENSORS
### Connect the instrument interface prototype up to SSDS on MARS (adapter or alternate ingest mechanism)
## Others? 
### ROVCTD
### LOBO
### BOG
### do we put more in SSDS?
### CO2 Initiative?
### CN Initiative?
----
## Data Aggregation
### Meetings
### (?)
## UW to Microsoft Proposal (RCO)
### "We (TBD) will bring SSDS up to UW and operate". SSDS collects and then Triton (WorldWind++) visualizes it. It will tie into  the .NET 3.0 Workflow Framework.
## UCSD Response to CI IO
### FIREWALLED
## MBARI Response to CI IO
### FIREWALLED
## CSO IO
### Possibly a temporary system to serve as a CI proxy.
## LOOKING (20 days)
### Jim wants to merge AOSN Data System and SSDS and then connect COOP and MoQUA to that.
### Federated observatory prototype include components of SSDS as repository (catalog, processing and preserving data)
## AOSN
### If Jim uses looking for merge, AOSN will use that. Dependent on LOOKING.
## SNMP is an activity
### ESB at NCSA
### ESB at MBARI
### Sending packets back and forth.
### To get diagram
### SENSORS build instrument interface and connect to ESB.
### SSDS is on ESB to collect and catalog data.
## NCSA Proposal to NSF to extend SNMP work (keeps it going)
### Product are offered to community (OpenSource)
## Nekton Research/NOAA
### MBARI share SSDS code
### Nekton will package SSDS with 2 AUVs delivered.
### Get Nekton engineers to be self reliant with SSDS.
### Would they be interested in AUV science data processing?
### Would need something like AUVCTD portal code to convert Nekton AUV data to XML/SSDS Data model.
### Conference call with them.
## NOAA Proposal (Francisco)
### (?)
## CenCOOS (?) Related to NOAA Proposal and Data Aggregation?
## Dalhousie (?)
### Waiting on us to deliver exportable code (they can compile and run).
### Preconfigured properties for building for them
### Tracking metadata and data for their moorings.
### They might provide some user interfaces for SSDS.
### Haven't talked to them in a while.
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
## Metadata editing/management (and other UIs)
## Plan for the transition (written) and resources needed
## Move core to support or vice versa.
## Documentation
## Move to Subversion (get rid of branches)
## Plan and agreement for future work/development
## Operational interfaces (component health/statistics/log crawlers)
## Improve data stream monitoring system (NAGIOS a possibility)
## Controlled vocabularies (instrument types) overlap with MMI?
## Load all OASIS data.
## Workflow for instrument data streams.
# How do we best open source SSDS?
## Current licensing website (?)
### Did not formalize license yet
### Not utilized
## What is still to be done to open source?
### Pick a license
### Decide on distribution mechanism (talk to Brian and Luis)
### Clean up code/copyright.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630812</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663569</id>
</element>
</collection>
<property name="version">72</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:32:51.220</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355992</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388753</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-06 13:07:14.153</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">15630811</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">15663568</id>
</element>
</collection>
<property name="version">71</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-01-05 15:29:37.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355993</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388754</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 12:54:12.483</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8912925</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8945692</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-21 14:13:38.747</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355988</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388749</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 09:14:30.447</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953492</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://moopzoopfever.com/]]></property>
<property name="title"><![CDATA[not fake]]></property>
<property name="blogName"><![CDATA[not fake]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-01-12 23:31:39.003</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-12 23:31:39.003</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8355990</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388751</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 09:33:14.497</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953458</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.sbjmeditation.com/xe/media/316]]></property>
<property name="title"><![CDATA[the pirate bay movies format]]></property>
<property name="blogName"><![CDATA[the pirate bay movies format]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-27 07:35:04.760</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-27 07:35:04.760</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953459</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.boardwalkgambler.com/?p=223]]></property>
<property name="title"><![CDATA[try this web-site]]></property>
<property name="blogName"><![CDATA[try this web-site]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-28 07:20:28.460</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-28 07:20:28.460</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953460</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.grimhouse.net/?document_srl=22164]]></property>
<property name="title"><![CDATA[visit my web page]]></property>
<property name="blogName"><![CDATA[visit my web page]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-29 07:21:37.387</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-29 07:21:37.387</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953454</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://photos.thetoyotaclub.com/displayimage.php?pos=-26]]></property>
<property name="title"><![CDATA[proxykat]]></property>
<property name="blogName"><![CDATA[proxykat]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-16 12:38:03.333</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-16 12:38:03.333</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356152</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388905</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-13 13:13:57.873</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953455</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://qwww.Wwfefw.radabg.com/url/bayproxy.me/]]></property>
<property name="title"><![CDATA[torrents]]></property>
<property name="blogName"><![CDATA[torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-17 21:26:16.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-17 21:26:16.023</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953456</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://Tpbunblocked.com/]]></property>
<property name="title"><![CDATA[Tpbunblocked.com]]></property>
<property name="blogName"><![CDATA[Tpbunblocked.com]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-18 09:04:49.663</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-18 09:04:49.663</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953450</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.primekorea.co.kr/901504]]></property>
<property name="title"><![CDATA[stream the simpsons]]></property>
<property name="blogName"><![CDATA[stream the simpsons]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-07 18:03:16.467</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-07 18:03:16.467</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953451</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.sprio.jp/%E5%AE%89%E7%94%B0%E8%A8%98%E5%BF%B5%E5%87%BA%E8%B5%B0%E9%A6%AC/%E5%AE%89%E7%94%B0%E8%A8%98%E5%BF%B5%E6%9C%89%E5%8A%9B%E9%A6%AC%E3%81%AE%E6%88%A6%E7%B8%BE%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88/]]></property>
<property name="title"><![CDATA[the simpsons free]]></property>
<property name="blogName"><![CDATA[the simpsons free]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-10 16:02:49.397</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-10 16:02:49.397</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953452</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.sdcompany.kr/?document_srl=55963]]></property>
<property name="title"><![CDATA[kick ass torrents]]></property>
<property name="blogName"><![CDATA[kick ass torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-15 05:19:56.833</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-15 05:19:56.833</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953446</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.cmwww.radabg.com/url/tpbunblocked.com/]]></property>
<property name="title"><![CDATA[www.cmwww.radabg.com]]></property>
<property name="blogName"><![CDATA[www.cmwww.radabg.com]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-02 08:48:02.347</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-02 08:48:02.347</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953447</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://dhlr.me/8a5]]></property>
<property name="title"><![CDATA[bit torrents of rain movie downloads]]></property>
<property name="blogName"><![CDATA[bit torrents of rain movie downloads]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-02 20:45:29.510</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-02 20:45:29.510</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953448</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.bestreviewdomain.us/d/tpbunblocked.com]]></property>
<property name="title"><![CDATA[pirate bay proxy]]></property>
<property name="blogName"><![CDATA[pirate bay proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-04 04:12:41.267</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-04 04:12:41.267</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953449</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://lk.57883.net/alexa/lk/index.asp?domain=proxybay.net]]></property>
<property name="title"><![CDATA[tarantino movies dvd]]></property>
<property name="blogName"><![CDATA[tarantino movies dvd]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-12-05 15:15:53.973</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-05 15:15:53.973</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356163</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388916</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-13 15:23:06.107</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953442</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://library.mopartrucksandstuff.com/tiki-index.php?page=UserPagelounurba]]></property>
<property name="title"><![CDATA[pirate bay]]></property>
<property name="blogName"><![CDATA[pirate bay]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-30 16:44:17.333</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-30 16:44:17.333</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034792</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.cometsmilitaryed.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-12 21:03:01.877</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-12 21:03:01.877</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953440</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://net.epufloor.net/info/proxybay.net]]></property>
<property name="title"><![CDATA[torrents.to movies]]></property>
<property name="blogName"><![CDATA[torrents.to movies]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-29 16:42:43.057</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-29 16:42:43.057</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953437</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.movie4kproxy.net/]]></property>
<property name="title"><![CDATA[movie4kproxy.net]]></property>
<property name="blogName"><![CDATA[movie4kproxy.net]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-28 22:43:36.087</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-18 18:20:42.037</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953436</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://friendsearnmoney.com/google-adsense/adsense-pin-verification-mail-not-received-verify-by-uploading-digital-image-of-your-govt-issued-id/]]></property>
<property name="title"><![CDATA[the pirate bay t-shirt buy]]></property>
<property name="blogName"><![CDATA[the pirate bay t-shirt buy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-28 15:04:52.013</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-28 15:04:52.013</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25034802</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.goldeneaglesr.com]]></property>
<property name="title"><![CDATA[sbobet]]></property>
<property name="blogName"><![CDATA[sbobet]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-12 21:38:45.110</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-12 21:38:45.110</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356160</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388913</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-12-18 16:27:18.643</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953433</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://melodypostmastudio.com/?attachment_id=23]]></property>
<property name="title"><![CDATA[torrent finder free download]]></property>
<property name="blogName"><![CDATA[torrent finder free download]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-27 01:16:39.773</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-27 01:16:39.773</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356161</id>
<property name="title"><![CDATA[Publishing other non-SIAM data to SSDS]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388914</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2008-12-18 11:24:49.237</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-13 15:20:11.767</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953432</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.moapaint.com/xe/1163178]]></property>
<property name="title"><![CDATA[torrent]]></property>
<property name="blogName"><![CDATA[torrent]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-26 20:42:53.163</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-26 20:42:53.163</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">48</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[SETSPACEPERMISSIONS]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953428</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://doinrite.com/content/finding-no-fuss-methods-kick-ass-torrents]]></property>
<property name="title"><![CDATA[click through the following page]]></property>
<property name="blogName"><![CDATA[click through the following page]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-26 03:50:50.777</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-26 03:50:50.777</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">47</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[EDITSPACE]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953429</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://thejuicyshop.com/MilesSams]]></property>
<property name="title"><![CDATA[torrent proxy]]></property>
<property name="blogName"><![CDATA[torrent proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-26 10:35:35.057</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-26 10:35:35.057</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">46</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[COMMENT]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">6750218</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">6782986</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-06-17 16:48:30.587</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">45</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[VIEWSPACE]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.627</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.627</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">6750211</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">6782979</id>
</element>
</collection>
<property name="version">58</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-03 13:17:21.843</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">52</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[CREATEATTACHMENT]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">51</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[REMOVEBLOG]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953425</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://tpbunblocked.com/]]></property>
<property name="title"><![CDATA[tpbunblocked.Com]]></property>
<property name="blogName"><![CDATA[tpbunblocked.Com]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-25 12:29:08.323</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-29 07:45:32.147</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">6750213</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">6782981</id>
</element>
</collection>
<property name="version">59</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:13:50.257</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">50</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[REMOVECOMMENT]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953422</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.seanduffyphotography.com/sdp/index.php?showimage=11&popup=comment]]></property>
<property name="title"><![CDATA[click through the following website]]></property>
<property name="blogName"><![CDATA[click through the following website]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-22 12:36:53.277</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-22 12:36:53.277</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">49</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[REMOVEPAGE]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953423</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.ikate.org/index.php?title=Usuario:AngelesRa]]></property>
<property name="title"><![CDATA[patagonia torrentshell pullover review]]></property>
<property name="blogName"><![CDATA[patagonia torrentshell pullover review]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-22 13:15:23.743</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-22 13:15:23.743</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">6750214</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">6782982</id>
</element>
</collection>
<property name="version">45</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-08-13 09:06:55.550</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953420</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.pakhazara.com/index.php?do=/profile-1687/info/]]></property>
<property name="title"><![CDATA[the pirate bay proxy server]]></property>
<property name="blogName"><![CDATA[the pirate bay proxy server]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-22 01:36:23.183</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-22 01:36:23.183</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953418</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.wwfew.radabg.com/url/bayproxy.me/]]></property>
<property name="title"><![CDATA[proxy]]></property>
<property name="blogName"><![CDATA[proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-21 03:05:10.463</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-21 03:05:10.463</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953416</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://fischerhouse.com/b2e/index.php?blog=3&p=19&more=1&c=1&tb=1&pb=1]]></property>
<property name="title"><![CDATA[torrent kayak for sale]]></property>
<property name="blogName"><![CDATA[torrent kayak for sale]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-20 03:46:51.913</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-20 03:46:51.913</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17891620</id>
<property name="body"><![CDATA[In July of 2011, the database server that SSDS was running against was a an older version of SQL Server (2000) and SSDS was filling up the disk on Solstice.  For this reason, it was decided to create a whole new server in the DMZ running SQL 2008 and to move the SSDS databases to that machine.  Here are the steps taken during that work:

# 7:41 AM: SSH'd into pismo as kgomes
# 7:44 AM: edited the crontab using 'crontab -e' and commented out the entries that ran the data checker and the graphing routines.
# 7:45 AM: Verified the updatebot was runnning using 'ps -ef'
{noformat}
root      4203     1  0 Jul07 ?        00:00:15 /usr/java/jdk1.6.0_06/bin/java -Duser.timezone=UTC -Xms512m -Xmx1024m -classpath /opt/ssds/updatebot/ssds-updatebot-client-new-ssds.jar moos.ssds.clients.updateBot.UpdateBotRunner
{noformat}
# 7:45 AM: stopped the updatebot service using 'sudo /sbin/service updatebot stop'
# 7:49 AM: ssh'd into new-ssds.mbari.org as kgomes
# 7:50 AM: in another windows, ssh'd into bob.shore.mbari.org as kgomes
# 7:50 AM: verified JBoss was running on bob, using 'ps -aux' and getting:
{noformat}
root   11926   0.4 -4.8  1325572 100336  ??  S    27Jun11 1313:48.61 /usr/bin/java -server -Xmx1024M -Djboss.server.temp.dir=/var/tmp/jbosstmpdata11922 -classpath /Library/JBoss/3.2/bin/run.jar org.jboss.Main -c deploy-standalone
{noformat}
# 7:50 AM: on bob.shore.mbari.org, shut off the JBoss instance using:
{noformat}
sudo serveradmin stop appserver
{noformat}
# 7:54 AM: could not shutdown JBoss on new-ssds.mbari.org using 'sudo /sbin/service jboss stop' and figured out that I had to use:
{noformat}
cd /opt/jboss/bin
./shutdown.sh -S -s 134.89.2.25
{noformat}
# 8:16 AM: bob.shore.mbari.org had some oddities with iagadmin account, so I rebooted bob remotely using
{noformat}
sudo shutdown -r now
{noformat}
and then stopped the jboss service again.
# I then copied all the pertinent files from bob.shore.mbari.org, new-ssds and pismo to my local machine so I could edit them locally.
# While I don't think this is really an issue, all the editing of files that I do here is done with vi from the command line due to the fact that I am running on OS X and I don't want any editing software doing anything funny.
# I decided that in order to keep my changes consistent with what was in the source code repo, I used the new-ssds.mbari.org build I had on my laptop and edited the new-ssds.mbari.org configuration properties and just ran the build again.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17858877</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953415</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.centroclinicoviabrasil.com.br/author/LeonorAle]]></property>
<property name="title"><![CDATA[kick ass torrents]]></property>
<property name="blogName"><![CDATA[kick ass torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-20 03:23:50.667</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-20 03:23:50.667</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">23953412</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://comunidad-epcp.cambioandino.org/profile_info.php?ID=82259&my]]></property>
<property name="title"><![CDATA[kickasstorrents]]></property>
<property name="blogName"><![CDATA[kickasstorrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-11-19 13:44:57.863</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-11-19 13:44:57.863</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9798394</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9831144</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-12-30 13:29:53.517</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">838</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  See [Windows Installation] for an example done for USC on a Windows box.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
# Once JBoss finishes startup, you should see the line:
{noformat}
17:12:41,607 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 19s:45ms
{noformat}
and hopefully you did not see any stack traces fly by during startup.  If all looks OK, you should be able to go the SSDS_Metadata database and see newly created tables that will be where SSDS will store is metadata.  You can also open a browser and go to [http://localhost:8080/ssds-docs/] to see a simple page with some links to SSDS documentation and various utilities and libraries.
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
In order to actually do some development on the SSDS code base, you can use an IDE like Eclipse to edit the code and use ant to deploy your changes to JBoss.  To setup an Eclipse project.
# Install eclipse that you download from [http://www.eclipse.org]
# Startup Eclipse and select File->New->Java Project.
# In the New Project Window, select 'Create project from existing source' and browse to where you checked out the SSDS source code.  Once you configure the project correctly, you should have the following project settings:
## There should be two source directories:
{noformat}
src/java
{noformat}
and
{noformat}
src/gen
{noformat}
(src/gen is created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/build/flex and choose it for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}
# Click on Finish

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356088</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388845</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:52:08.050</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356087</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388844</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-10 19:52:24.737</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355406</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388137</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 12:59:17.527</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356084</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388841</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:42:48.067</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356086</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388843</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:44:46.293</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356080</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388837</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:21:15.023</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355411</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388142</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 15:59:36.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356082</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388839</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:32:10.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355413</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388144</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:30:25.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356076</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388833</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:40:45.710</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355415</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388146</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:39:07.153</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355416</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388147</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:40:02.687</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356078</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388835</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:12:44.283</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355417</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388148</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:40:28.880</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355419</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388150</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:40:51.567</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355421</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388152</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:48:04.143</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389125</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-0.5.tar.gz)
# Unzipped the file.
{noformat}
gunzip qpid-0.5.tar.gz
{noformat}
# Untarred the file.
{noformat}
tar -xvf qpid-0.5.tar
{noformat}
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# To get help2man, I downloaded the tar.gz from here: [http://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]
# Unzipped the file
{noformat}
gunzip help2man-1.36.4.tar.gz
{noformat}
# Untarred it
{noformat}
tar -xvf help2man-1.36.4.tar
{noformat}
# I then cd'd into that directory and ran
{noformat}
./configure --prefix=/root/Qpid/qpid-tools
{noformat}
which then died with:
{noformat}
configure: error: perl module Locale::gettext required
{noformat}
# So, I installed the gettext-1.05.tar.gz perl module by downloading it, unzipping, unpacking, cd'ing into gettext-1.05 and running:
{noformat}
perl Makefile.PL
make
make test
make install
{noformat}
# Went back to the help2man directory and tried it again (it succeeded this time)
# Now run make
{noformat}
make install
{noformat}
which seemed to work OK.
# Now for graphviz, I went to http://www.graphviz.org and downloaded the .rmp file and let RHEL open it with the package installer automatically.
# I clicked on 'Apply' and installed it OK.
# Because I wanted to explore using the clustering, I installed openais using yum by executing
{noformat}
yum install openais
{noformat}
# In order to get the XML exchange working, I need to install  xerces by going to http://xerces.apache.org/xerces-c/ and downloading the latest version for 64 bit linux (tar.gz).
# I unzipped it, untarred it
# I then wanted to install xqilla and went to http://sourceforge.net/projects/xqilla/files/ to get the source.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356413</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355423</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388154</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:50:55.653</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355426</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388157</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:54:46.260</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355429</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388160</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 16:57:21.967</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355431</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388162</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 17:02:15.930</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355433</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388164</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-07-16 17:12:06.060</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945734</id>
<property name="body"><![CDATA[{anchor:createDuplicateDeepDeployment}
{panel:title=createDuplicateDeepDeployment}
h5. Background
The purpose of this service was to have a way to make copies of deployments in SSDS.  Often times we want to duplicate an instance of a deployment, but we want to copy all of its sub-deployment children as well, hence the "deep" part of the copy. This method takes in a <code>DataProducer</code> that must be of type "deployment" and then creates "deep" copy of it and persists the new copy. It pulls in the options specified in the incoming parameters to create a unique copy of the DataProducers and DataContainer (outputs). All the rest of the object should be linked to the ones that already exist in the peristent storage. The new ID of the duplicate deployment is returned. 

h5. The Interface
||Return||Parameters||
|The ID of the newly generated deployment|* DataProducer to Copy
* Date the copy should start at
* A boolean to indicate if the old (original) should be closed
* Date the old (original) should use as an end date (if to be closed)
* String that will be the name of the new deployment (copy)
* String that is the base of the data stream URI which should be {code}http://new-ssds.mbari.org/servlet/GetOriginalDataServlet{code}|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long createDuplicateDeepDeployment(
        DataProducer deploymentToCopy,          // DataProducer to copy
        Date newStartDate,                      // Date to start copied DataProducer on
        boolean closeOld,                       // Whether or not old (original) should be closed
        Date oldEndDate,                        // Date to use for end date if original is closed
        String newHeadDeploymentName,           // Name of the new DataProducer (copy)
        String baseDataStreamUri                // Base URI for raw data access (http://new-ssds.mbari.org/servlet/GetOriginalDataServlet)
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=createDuplicateDeepDeployment
&p1Type=DataProducer&p1Value=DataProducer|id=1938292
&p2Type=Date&p2Value=2008-12-01T00:00:00Z
&p3Type=boolean&p3Value=true
&p4Type=Date&p4Value=2008-11-30T00:00:00Z
&p5Type=String&p5Value=New copy of Deployment
&p6Type=String&p6Value=http://new-ssds.mbari.org/servlet/GetOriginalDataServlet
{code}
And the return might looks something like this:
{code}
Result(s):
java.lang.Long|29985
{code}
h5. Web Services client
Under construction
{panel}

{anchor:makePersistent}
{panel:title=makePersistent}
h5. Background
The purpose of this service is to insert (or update) a DataProducer in the SSDS.  If the DataProducer already exists (the equal criteria is by ID and then if no ID specified, it uses the outputs) it will update it, if not it will create a new one. 

h5. The Interface
||Return||Parameters||
|The ID of the created or updated DataProducer|* DataProducer to persist|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long makePersistent(
    DataProducer dataProducerToPersist         // This is the DataProducer that will be updated or created
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=makePersistent
&p1Type=DataProducer&p1Value=DataProducer|name=MUCE - January 2009 test|description=MUCE Test Deployment|dataProducerType=Deployment|startDate=2009-01-10T12:00:00Z
{code}
And the return might looks something like this:
{code}
Result(s):
java.lang.Long|29991
{code}
h5. Web Services client
Under construction
{panel}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912969</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945735</id>
<property name="body"><![CDATA[{anchor:getDataStreamProperties}
{panel:title=searchDataStream}
h5. Background
A service was need to search data streams for some specific text.  This service does not apply to all instruments as not all instruments output ASCII in their packets, but it was deemed handy to have for those that do output ASCII. 
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device whose data stream the user wants to search|Any SSDS ID|N/A|Y|
|Expression|This is the regular expression (Java style) that will be used to search for|Any valid regular expression|N/A|Y|
|PacketOrLine|This is an option that specifies if the service should return the whole packet contents if a match is found, or if just the line out of the packet is found|_PACKET_ or _LINE_|_PACKET_|N|

h5. The Interface

{code:title= searchDataStream}
// Packet or line enumerations
public final static String RETURN_PACKET = "packet";
public final static String RETURN_LINE = "line";

searchDataStream(
     Long deviceID,                     // The ID of the Device whose data stream will be searched
     String expression,                 // The (Java style) regular expression to look for in the
                                        // data stream
     packetOrLine                       // The flag to indicate if the user wants the whole packet
                                        // from the match returned, or just the line
)
{code}

The call will return a collection of *SSDSDevicePackets* 

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}
{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356116</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388873</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-13 10:12:26.593</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829811</id>
<property name="body"><![CDATA[In order to make sure I can move the production application to the Google code base, I need to go through each .java file and make sure I have tests and documentation written for each one.  Here is the listing of all the .java files currently in the SSDS code base:

h5. Classes
|| Package || File || Test Class || Complete || 
| moos.ssds.clients.graphing | DeviceQCPlotCreator.java | | |
| moos.ssds.clients.ssdsLoads | FileParser.java | | |
| moos.ssds.clients.ssdsLoads | SubmitFiles.java | | |
| moos.ssds.clients.updateBot | UpdateBot.java | | |
| moos.ssds.clients.updateBot | UpdateBotListener.java | | |
| moos.ssds.clients.updateBot | UpdateBotRunner.java | | |
| moos.ssds.dao | DataContainerDAO.java | | |
| moos.ssds.dao | DataContainerGroupDAO.java | | |
| moos.ssds.dao | DataProducerDAO.java | | |
| moos.ssds.dao | DataProducerGroupDAO.java | | |
| moos.ssds.dao | DeviceDAO.java | | |
| moos.ssds.dao | DeviceTypeDAO.java | | |
| moos.ssds.dao | EventDAO.java | | |
| moos.ssds.dao | HeaderDescriptionDAO.java | | |
| moos.ssds.dao | IMetadataDAO.java | | |
| moos.ssds.dao | KeywordDAO.java | | |
| moos.ssds.dao | MetadataDAO.java | | |
| moos.ssds.dao | PersonDAO.java | | |
| moos.ssds.dao | RecordDescriptionDAO.java | | |
| moos.ssds.dao | RecordVariableDAO.java | | |
| moos.ssds.dao | ResourceDAO.java | | |
| moos.ssds.dao | ResourceTypeDAO.java | | |
| moos.ssds.dao | SoftwareDAO.java | | |
| moos.ssds.dao | StandardDomainDAO.java | | |
| moos.ssds.dao | StandardKeywordDAO.java | | |
| moos.ssds.dao | StandardReferenceScaleDAO.java | | |
| moos.ssds.dao | StandardUnitDAO.java | | |
| moos.ssds.dao | StandardVariableDAO.java | | |
| moos.ssds.dao | UserGroupDAO.java | | |
| moos.ssds.dao.util | MetadataAccessException.java | | |
| moos.ssds.data.converters | NetcdfConverter.java | | |
| moos.ssds.data.graphing | AnchorDrawer.java | | |
| moos.ssds.data.graphing | ColorBarBugFix.java | | |
| moos.ssds.data.graphing | DegreesMinutesNumberFormat.java | | |
| moos.ssds.data.graphing | DistanceScaleDrawer.java | | |
| moos.ssds.data.graphing | GpsCharter.java | | |
| moos.ssds.data.graphing | LatLonConverter.java | | |
| moos.ssds.data.graphing | LocationAndTimeDataset.java | | |
| moos.ssds.data.graphing | WatchCircleDrawer.java | | |
| moos.ssds.data.graphing | XYCircleRenderer.java | | |
| moos.ssds.data.graphing | XYPlotWithColorBar.java | | |
| moos.ssds.data | IDataAccess.java | | |
| moos.ssds.data | ITimeIndexedDataAccess.java | | |
| moos.ssds.data.parsers | AsciiFileContext.java | | |
| moos.ssds.data.parsers | AsciiFixedWidthParser.java | | |
| moos.ssds.data.parsers | AsciiPacketParser.java | | |
| moos.ssds.data.parsers | AsciiRecordParser.java | | |
| moos.ssds.data.parsers | BinaryFileContext.java | | |
| moos.ssds.data.parsers | BinaryPacketParser.java | | |
| moos.ssds.data.parsers | BinaryRecordParser.java | | |
| moos.ssds.data.parsers | IParser.java | | |
| moos.ssds.data.parsers | MultipartMimeFileContext.java | | |
| moos.ssds.data.parsers | Nmea21PacketParser.java | | |
| moos.ssds.data.parsers | Nmea21RecordParser.java | | |
| moos.ssds.data.parsers | PacketParser.java | | |
| moos.ssds.data.parsers | PacketParserContext.java | | |
| moos.ssds.data.parsers | Parser.java | | |
| moos.ssds.data.parsers | ParserContext.java | | |
| moos.ssds.data.parsers | ParsingException.java | | |
| moos.ssds.data.parsers | RecordParser.java | | |
| moos.ssds.data.parsers | VariableFormatMap.java | | |
| moos.ssds.data | TimeIndexedDataAccessFactory.java | | |
| moos.ssds.data | TimeIndexedFreeFormAccess.java | | |
| moos.ssds.data | TimeIndexedNetcdfAccess.java | | |
| moos.ssds.data | TimeIndexedPacketAccess.java | | |
| moos.ssds.data.util | DataException.java | | |
| moos.ssds.data.util | LocationAndTime.java | | |
| moos.ssds.ingest | IngestMDB.java | | |
| moos.ssds.ingest | SQLIngestMDB.java | | |
| moos.ssds.io | PacketInput.java | | |
| moos.ssds.io | PacketOutput.java | | |
| moos.ssds.io | PacketOutputManager.java | | |
| moos.ssds.io | PacketSQLInput.java | | |
| moos.ssds.io | PacketSQLOutput.java | | |
| moos.ssds.io.util | Base64.java | | |
| moos.ssds.io.util | CountInputStream.java | | |
| moos.ssds.io.util | PacketMerger.java | | |
| moos.ssds.jms | PublisherComponent.java | | |
| moos.ssds.jms | SubscriberComponent.java | | |
| moos.ssds.metadata | CommentTag.java | | |
| moos.ssds.metadata | DataContainer.java | | |
| moos.ssds.metadata | DataContainerGroup.java | | |
| moos.ssds.metadata | DataProducer.java | | |
| moos.ssds.metadata | DataProducerGroup.java | | |
| moos.ssds.metadata | DateRange.java | | |
| moos.ssds.metadata | Device.java | | |
| moos.ssds.metadata | DeviceType.java | | |
| moos.ssds.metadata | Event.java | | |
| moos.ssds.metadata | HeaderDescription.java | | |
| moos.ssds.metadata | IDateRange.java | | |
| moos.ssds.metadata | IDescription.java | | |
| moos.ssds.metadata | IMetadataObject.java | | |
| moos.ssds.metadata | IResourceOwner.java | | |
| moos.ssds.metadata | Keyword.java | | |
| moos.ssds.metadata | Person.java | | |
| moos.ssds.metadata | RecordDescription.java | | |
| moos.ssds.metadata | RecordVariable.java | | |
| moos.ssds.metadata | Resource.java | | |
| moos.ssds.metadata | ResourceBLOB.java | | |
| moos.ssds.metadata | ResourceType.java | | |
| moos.ssds.metadata | Software.java | | |
| moos.ssds.metadata | StandardDomain.java | | |
| moos.ssds.metadata | StandardKeyword.java | | |
| moos.ssds.metadata | StandardReferenceScale.java | | |
| moos.ssds.metadata | StandardUnit.java | | |
| moos.ssds.metadata | StandardVariable.java | | |
| moos.ssds.metadata | UserGroup.java | | |
| moos.ssds.metadata.util | MetadataException.java | | |
| moos.ssds.metadata.util | MetadataFactory.java | | |
| moos.ssds.metadata.util | MetadataValidator.java | | |
| moos.ssds.metadata.util | ObjectBuilder.java | | |
| moos.ssds.metadata.util | XmlBuilder.java | | |
| moos.ssds.ruminate | Handler.java | | |
| moos.ssds.ruminate | MetadataHandler.java | | |
| moos.ssds.ruminate | RuminateMDB.java | | |
| moos.ssds.ruminate | XMLMetadataTracker.java | | |
| moos.ssds.services.blazeds | EJBFactory.java | | |
| moos.ssds.services.blazeds | IResourceLocator.java | | |
| moos.ssds.services.blazeds | LocalCachingJNDIResourceLocator.java | | |
| moos.ssds.services.blazeds | LocalJNDIResourceLocator.java | | |
| moos.ssds.services.blazeds | ResourceException.java | | |
| moos.ssds.services.blazeds | SessionRO.java | | |
| moos.ssds.services.data | DeviceDataAccessEJB.java | | |
| moos.ssds.services.data.graphing | GeospatialGraphingAccessEJB.java | | |
| moos.ssds.services.data | PacketFileToSQLServicePublisher.java | | |
| moos.ssds.services.data | PacketSubmissionAccessEJB.java | | |
| moos.ssds.services.data | RecordVariableDataAccessEJB.java | | |
| moos.ssds.services.data | SQLDataStreamRawDataAccessEJB.java | | |
| moos.ssds.services.data.util | DataException.java | | |
| moos.ssds.services.metadata | AccessBean.java | | |
| moos.ssds.services.metadata | DataContainerAccessEJB.java | | |
| moos.ssds.services.metadata | DataContainerGroupAccessEJB.java | | |
| moos.ssds.services.metadata | DataProducerAccessEJB.java | | |
| moos.ssds.services.metadata | DataProducerGroupAccessEJB.java | | |
| moos.ssds.services.metadata | DeviceAccessEJB.java | | |
| moos.ssds.services.metadata | DeviceTypeAccessEJB.java | | |
| moos.ssds.services.metadata | EventAccessEJB.java | | |
| moos.ssds.services.metadata | IMetadataAccess.java | | |
| moos.ssds.services.metadata | IMetadataAccessRemote.java | | |
| moos.ssds.services.metadata | KeywordAccessEJB.java | | |
| moos.ssds.services.metadata | PersonAccessEJB.java | | |
| moos.ssds.services.metadata | RecordVariableAccessEJB.java | | |
| moos.ssds.services.metadata | ResourceAccessEJB.java | | |
| moos.ssds.services.metadata | ResourceTypeAccessEJB.java | | |
| moos.ssds.services.metadata | SoftwareAccessEJB.java | | |
| moos.ssds.services.metadata | StandardDomainAccessEJB.java | | |
| moos.ssds.services.metadata | StandardKeywordAccessEJB.java | | |
| moos.ssds.services.metadata | StandardReferenceScaleAccessEJB.java | | |
| moos.ssds.services.metadata | StandardUnitAccessEJB.java | | |
| moos.ssds.services.metadata | StandardVariableAccessEJB.java | | |
| moos.ssds.services.metadata | UserGroupAccessEJB.java | | |
| moos.ssds.services.servlet.ajax | GoogleMapsGPSDataServlet.java | | |
| moos.ssds.services.servlet.data | DataAccessServlet.java | | |
| moos.ssds.services.servlet.data | GetOriginalDataServlet.java | | |
| moos.ssds.services.servlet.metadata | MetadataAccessServlet.java | | |
| moos.ssds.services.servlet.metadata | SensorMLConverterServlet.java | | |
| moos.ssds.services.servlet.util | MethodProxy.java | | |
| moos.ssds.services.servlet.util | ServletFaultHandler.java | | |
| moos.ssds.services.servlet.util | ServletUtils.java | | |
| moos.ssds.simulator | DataPacket.java | | |
| moos.ssds.simulator | FileInfo.java | | |
| moos.ssds.simulator | PacketGenerator.java | | |
| moos.ssds.transmogrify | SIAMMetadataTracker.java | | |
| moos.ssds.transmogrify | SSDSDevicePacket.java | | |
| moos.ssds.transmogrify | SSDSGeoLocatedDevicePacket.java | | |
| moos.ssds.transmogrify | TransmogrifyMDB.java | | |
| moos.ssds.util | DateUtils.java | | |
| moos.ssds.util | XmlDateFormat.java | | |
| moos.ssds.wrapper.ogc.sensorml | SensorMLFactory.java | | |
| moos.ssds.wrappergenerator | Method.java | | |
| moos.ssds.wrappergenerator | MyClass.java | | |
| moos.ssds.wrappergenerator | Parameter.java | | |
| moos.ssds.wrappergenerator.parser | JavaLexer.java | | |
| moos.ssds.wrappergenerator.parser | JavaRecognizer.java | | |
| moos.ssds.wrappergenerator.parser | JavaTokenTypes.java | | |
| moos.ssds.wrappergenerator.parser | JavaTreeParser.java | | |
| moos.ssds.wrappergenerator.parser | JavaTreeParserTokenTypes.java | | |
| moos.ssds.wrappergenerator | PerlGenerator.java | | |
| moos.ssds.wrappergenerator | TranslationController.java | | |
| moos.ssds.wrappergenerator | TranslationGenerator.java | | |
| org.mbari.io | FilterCommentInputStream.java | | |
| org.mbari.io | URLDataBuffer.java | | |
| org.mbari.util | Email.java | | |
| org.mbari.util | IsBinary.java | | |
| org.mbari.util | MathUtil.java | | |
| org.mbari.util | SwingDecorators.java | | |
| org.mbari.util | SwingWorker.java | | |
| org.mbari.util | SystemUtil.java | | |
| org.mbari.util | URLUTF8Encoder.java | | |

h5. Test Classes
|| Package || File ||
| test.moos.ssds.data.parsers | TestAsciiPacketParser.java |
| test.moos.ssds.data.parsers | TestAsciiRecordParser.java |
| test.moos.ssds.data.parsers | TestBinaryPacketParser.java |
| test.moos.ssds.data.parsers | TestBinaryRecordParser.java |
| test.moos.ssds.data.parsers | TestNmea21PacketParser.java |
| test.moos.ssds.data.parsers | TestNmea21RecordParser.java |
| test.moos.ssds.jms | IngestPubThread.java |
| test.moos.ssds.jms | TestIngest.java |
| test.moos.ssds.metadata | TestDataContainer.java |
| test.moos.ssds.metadata | TestDevice.java |
| test.moos.ssds.metadata | TestDeviceType.java |
| test.moos.ssds.metadata | TestPerson.java |
| test.moos.ssds.metadata | TestStandardUnit.java |
| test.moos.ssds.metadata | TestStandardVariable.java |
| test.moos.ssds.metadata.util | LoggingDifferenceListener.java |
| test.moos.ssds.metadata.util | SansSuperficialDifferenceListener.java |
| test.moos.ssds.metadata.util | TestMetadataFactory.java |
| test.moos.ssds.metadata.util | TestObjectBuilder.java |
| test.moos.ssds.metadata.util | TestXmlDateFormat.java |
| test.moos.ssds.ruminate | TestNetCDFWatchdog.java |
| test.moos.ssds.ruminate | TestRuminate.java |
| test.moos.ssds.services.data | TestDeviceDataAccess.java |
| test.moos.ssds.services.metadata | TestAccessCase.java |
| test.moos.ssds.services.metadata | TestDataContainerAccess.java |
| test.moos.ssds.services.metadata | TestDataProducerAccess.java |
| test.moos.ssds.services.metadata | TestDeviceAccess.java |
| test.moos.ssds.services.metadata | TestDeviceTypeAccess.java |
| test.moos.ssds.services.metadata | TestEventAccess.java |
| test.moos.ssds.services.metadata | TestPersonAccess.java |
| test.moos.ssds.services.metadata | TestRecordVariableAccess.java |
| test.moos.ssds.services.metadata | TestStandardUnitAccess.java |
| test.moos.ssds.services.metadata | TestStandardVariableAccess.java |
| test.moos.ssds.services.metadata | TestUserGroupAccess.java |
| test.moos.ssds.transmogrify | TransmogrifyMDBTest.java |
| test.moos.ssds.util | TestDateUtil.java |
| test.moos.ssds.wrapper.ogc.sensorml | TestSensorMLFactory.java |]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797058</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829826</id>
<property name="body"><![CDATA[Initial teleconference with ALOHA Observatory Group:

h5. Attendees:
# MBARI
## Kevin Gomes
## Duane Edgington
## Bob Herlien
# ALOHA
## Fernando Santiago-Mandujano
## Paul Lethaby
## Jeffrey Schneider

Other contacts:
# Pat Thompson (I.T. Support for SSDS machine)
# MARS Team (ALOHA group was interested in contacting MARS team through Etch)

h5. Notes:
# Deployment on ALOHA Cabled Observatory
# Early January 2011
# Instruments:
## SBE37s (two of them)
## Array of thermistor SBE39s (10 of them inductively)
## ADCP (Sontek 250kHz), probably be getting an RDI deep water monitor
## BB2F 
## Two hydrophones (probably not managed through SIAM and SSDS)
## One video camera (not defined), assume video servers (probably not managed through SIAM and SSDS).
# They connect instruments to serial port terminal server (digi 4 port server).
# The deployment will be at 5000m depth
# They would like to use SSDS to do data management
# Would like to use SIAM to communicate with sensors.
# DataTurbine is of interest to the ALOHA guys and they would use it.
# They do not have PUCKs on their instruments, we said no problem.
# They are interested in Adaptive Sampling (automated).
## We felt this might be a good opportunity to get a constrained, real-world use case for adaptive sampling.
# They were interested in documentation for SIAM and its integration with DataTurbine
# Sample rates for instruments on average around once a minute (or a little less).
# Bob (for SIAM) and Kevin (for SSDS) will be the points of contacts for MBARI<->ALOHA interactions.

h5. Timeline:
More details to come from ALOHA group, but some timeline notes:
# Ship time is January
# They want test system in lab ASAP (they actually have some of it running currently)

h5. Action Items:
# Kevin will look back and try to get SSDS install going again on kainani.
# ALOHA group will send Bob information about instruments (IP addresses, etc.)
# Bob will look into getting SIAM running against their instruments.
# ALOHA group will work on generating a timeline with milestones like code freeze, integration and test, etc.

NOTE: As long as the time is not huge, we can charge to TTOS.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797073</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356114</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388871</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 10:41:42.270</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829824</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine malino.soest.hawaii.edu.  There are a couple of accounts that I used on malino during the installation.  They are:
# kgomes
# jboss
I also used the 'root' account on the mysql installation for the work I was doing on the database.
{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.25 for me.
{note}
# I first ssh'd into the malino and then started up the mysql client using
{noformat}
mysql --user=root --password
{noformat}
# I then created the two needed databases using:
{noformat}
create database ssds_data;
create database ssds_metadata;
{noformat}
# I then created a user that will have all rights to the databases that SSDS will use to connect:
{noformat}
create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'
{noformat}
# I then granted all rights to the databases for the newly created user
{noformat}
GRANT ALL ON ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL ON ssds_metadata.* TO 'ssdsadmin'@'localhost';
{noformat}
# I then checked out the source code on my malino in the jboss home directory /export/malino/jboss/ssds/build/shore-side-data-system-read-only
# I downloaded the adobe flex sdk and unpacked it in /export/malino/jboss/flex_sdk
# I downloaded apache ant and unzipped it in /export/malino/jboss/ant
# I created a .login file in the jboss home directory and set two environment variables
{noformat}
setenv JAVA_HOME /export/malino1/jdk
setenv ANT_HOME /export/malino/jboss/ant
{noformat}
# I removed the following applications by moving them to the jboss/backup directory in the jboss users's home directory
## admin-console.war
## jmx-console.war
## 
# I started up the JBoss on malino from the command line just to make sure it worked and all looked OK.
# I then copied the custom.properties.template file in the ssds source directory to a file called custom.properties and edited it to match all the configurations for the deployment on malino
# I then ran:
{noformat}
../../../ant/apache-ant-1.8.2/bin/ant deploy
{noformat}
from the /export/malino/jboss/ssds/build/shore-side-data-system-read-only directory and it deployed all the files to the JBoss installation.
# I then ran JBoss from the command line to make sure SSDS started up OK. (started up in 30s)
{note:title=Firewall issue}
I had to use the local firefox and point it to localhost to get to SSDS because of firewall issues (exported XTerm display)
{note}
# I used the ssds/newDeviceType.jsp page to create new device types for camera, CTD, ADP/currents, fluorometer, and inductive modem.
# I used the ssds/newPerson.jsp page to create a contact for Fernando
# I used the ssds/newDevice.jsp page to create all new device IDs for the ALOHA instruments and sent those IDs to the ALOHA team.
# I edited the /export/malino1/jboss/bin/run.conf and added the following parameters to the JAVA_OPTS environment variable:
{noformat}
-Djava.awt.headless=true -Duser.timezone=UTC
{noformat}
and also changed the Xms and Xmx to 1024 and 2048 respectively]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">19300614</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[VIEWSPACE]]></property>
<property name="group"><![CDATA[U_Employees]]></property>
<property name="userName"/><property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2012-06-18 17:31:59.780</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2012-06-18 17:31:59.780</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356136</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388892</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:52:59.973</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355400</id>
<property name="title"><![CDATA[Installation and Development]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388131</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-02-08 12:50:50.907</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-27 09:19:45.273</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">841</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10458414</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:52:13.333</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:52:13.333</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">9372424</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">9405156</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2008-11-20 13:15:29.247</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777259</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810027</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 14:35:33.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13205733</id>
<property name="destinationPageTitle"><![CDATA[//jboss.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-03 17:11:55.370</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.370</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13205732</id>
<property name="destinationPageTitle"><![CDATA[//httpd.apache.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-03 17:11:55.370</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.370</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13205734</id>
<property name="destinationPageTitle"><![CDATA[//shore-side-data-system.googlecode.com/svn/trunk]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-03 17:11:55.370</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.370</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13205730</id>
<property name="destinationPageTitle"><![CDATA[//java.sun.com]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-03 17:11:55.370</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.370</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">13205731</id>
<property name="destinationPageTitle"><![CDATA[//ant.apache.org]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240414</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-06-03 17:11:55.370</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-03 17:11:55.370</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356216</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388964</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-13 10:13:53.603</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">8356217</id>
<property name="title"><![CDATA[Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">8388965</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-08 16:16:54.793</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-15 12:51:47.440</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355981</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">58</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[SETPAGEPERMISSIONS]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">57</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[REMOVEMAIL]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">25363009</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://sede.dalleragomme.it/wiki/index.php/A_Merchant_Cash_Advance_Success_Story]]></property>
<property name="title"><![CDATA[credit cards travel rewards]]></property>
<property name="blogName"><![CDATA[credit cards travel rewards]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-03-05 14:25:33.280</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-03-05 14:25:33.280</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">54</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[EDITBLOG]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">53</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[REMOVEATTACHMENT]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">56</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[EXPORTSPACE]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">21495819</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://familyguypress.kazeo.com]]></property>
<property name="title"><![CDATA[simply click the up coming website page]]></property>
<property name="blogName"><![CDATA[simply click the up coming website page]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-08-02 06:57:34.263</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-08-25 02:38:23.933</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">55</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[EXPORTPAGE]]></property>
<property name="group"/><property name="userName"><![CDATA[kgomes]]></property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.637</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.637</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">21495828</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://bayproxy.me/]]></property>
<property name="title"><![CDATA[The Pirate Bay]]></property>
<property name="blogName"><![CDATA[The Pirate Bay]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-08-22 08:05:09.607</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-12-05 22:38:53.747</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">21495826</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://test.craftkeys.com/site-info/proxybay.net]]></property>
<property name="title"><![CDATA[the pirate bay ebooks]]></property>
<property name="blogName"><![CDATA[the pirate bay ebooks]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-08-15 20:20:13.553</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-08-15 20:20:13.553</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">2162927</id>
<property name="title"><![CDATA[Instrument Swap on Oasis Mooring]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">2195693</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-08-03 07:17:05.643</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2007-08-03 09:44:52.413</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">21495827</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://tpbunblocker.com/]]></property>
<property name="title"><![CDATA[tpbunblocker.com]]></property>
<property name="blogName"><![CDATA[tpbunblocker.com]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-08-17 05:20:02.903</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-08-17 05:20:02.903</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22446083</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://proxybay.net/]]></property>
<property name="title"><![CDATA[pirate Bay proxy]]></property>
<property name="blogName"><![CDATA[pirate Bay proxy]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-08 11:15:53.200</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-01-01 00:18:08.023</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22446082</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://scratchez.com/PenniGree]]></property>
<property name="title"><![CDATA[the pirate bay org torrents]]></property>
<property name="blogName"><![CDATA[the pirate bay org torrents]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-08 02:34:08.200</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-09-08 02:34:08.200</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">14024905</id>
<property name="destinationPageTitle"><![CDATA[//oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664436</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-07-28 08:02:19.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-07-28 08:02:19.663</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777255</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810023</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 14:31:58.783</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777257</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810025</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 14:34:45.330</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170436</id>
<property name="fileName"><![CDATA[wind_SEA_WATER_TEMPERATURE_HR_last30_before.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 09:36:34.580</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 09:36:34.580</property>
<property name="fileSize">51203</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777251</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810019</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 14:16:53.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170437</id>
<property name="fileName"><![CDATA[wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 09:36:43.503</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 09:36:43.503</property>
<property name="fileSize">51203</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777253</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810021</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 14:17:09.927</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170435</id>
<property name="fileName"><![CDATA[m1_ngd_sum.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 00:01:14.877</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 00:01:14.877</property>
<property name="fileSize">26627</property>
<property name="comment"><![CDATA[Results of debugging Ferret plot commands]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170440</id>
<property name="fileName"><![CDATA[m1_lines.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 11:50:08.487</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 11:50:08.487</property>
<property name="fileSize">29144</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">17170438</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170441</id>
<property name="fileName"><![CDATA[m1_compare_20.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 12:04:19.047</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:04:19.047</property>
<property name="fileSize">10455</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777248</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810016</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:25:51.250</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170438</id>
<property name="fileName"><![CDATA[m1_lines.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 11:50:08.487</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 11:53:48.827</property>
<property name="fileSize">18725</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">2</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170439</id>
<property name="fileName"><![CDATA[m1_shade.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 11:50:17.740</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 11:50:17.740</property>
<property name="fileSize">31945</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">16777250</id>
<property name="title"><![CDATA[ALOHA]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16810018</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:25:51.250</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-04-14 13:46:17.857</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797071</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">17170442</id>
<property name="fileName"><![CDATA[m1_compare_40.gif]]></property>
<property name="contentType"><![CDATA[image/gif]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-06-02 12:09:15.227</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-02 12:09:15.227</property>
<property name="fileSize">12486</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797286</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830030</id>
</element>
</collection>
<property name="version">63</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 18:10:57.723</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">3604482</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/OASIS+Mooring+turn]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-04-11 08:28:15.050</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-04-11 08:28:15.050</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797284</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830028</id>
</element>
</collection>
<property name="version">62</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:55:48.197</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797289</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830033</id>
</element>
</collection>
<property name="version">65</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 22:11:43.553</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797287</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830031</id>
</element>
</collection>
<property name="version">64</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 18:13:56.557</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797277</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830021</id>
</element>
</collection>
<property name="version">58</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:05:51.883</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797275</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830019</id>
</element>
</collection>
<property name="version">57</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:02:14.650</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797282</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830026</id>
</element>
</collection>
<property name="version">61</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:30:15.387</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797280</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830024</id>
</element>
</collection>
<property name="version">60</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:29:38.237</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797279</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830023</id>
</element>
</collection>
<property name="version">59</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 17:16:14.583</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797269</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830013</id>
</element>
</collection>
<property name="version">54</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:57:14.473</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797268</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830012</id>
</element>
</collection>
<property name="version">53</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:55:46.863</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797273</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830017</id>
</element>
</collection>
<property name="version">56</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:59:12.157</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797271</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830015</id>
</element>
</collection>
<property name="version">55</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:57:54.247</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797261</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830005</id>
</element>
</collection>
<property name="version">49</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:32:42.917</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848528</id>
<property name="destinationPageTitle"><![CDATA[Improve Testing]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797262</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830006</id>
</element>
</collection>
<property name="version">50</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:52:48.507</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848529</id>
<property name="destinationPageTitle"><![CDATA[Enhance Access Interfaces]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848530</id>
<property name="destinationPageTitle"><![CDATA[Improve Data Ingest Mechanisms]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848531</id>
<property name="destinationPageTitle"><![CDATA[Documentation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.393</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.393</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848524</id>
<property name="destinationPageTitle"><![CDATA[Project Plan]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797266</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830010</id>
</element>
</collection>
<property name="version">52</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:54:15.453</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848525</id>
<property name="destinationPageTitle"><![CDATA[Cleanup Configuration Management]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848526</id>
<property name="destinationPageTitle"><![CDATA[Internal Application Consolidation]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797264</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830008</id>
</element>
</collection>
<property name="version">51</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 16:53:26.140</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848527</id>
<property name="destinationPageTitle"><![CDATA[Metadata Integrity Checking-Repairing-Enhancing]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.390</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.390</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042902</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-05 12:19:46.223</property>
<property name="fileSize">17405</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">11</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797256</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830000</id>
</element>
</collection>
<property name="version">47</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 15:55:43.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797255</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829999</id>
</element>
</collection>
<property name="version">46</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 11:59:15.357</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797258</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830002</id>
</element>
</collection>
<property name="version">48</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 15:56:12.390</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848533</id>
<property name="destinationPageTitle"><![CDATA[//www.hibernate.org/100.html Hibernate code]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.393</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.393</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">6848532</id>
<property name="destinationPageTitle"><![CDATA[Prepare for Opening to Community]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-10-21 16:16:10.393</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-10-21 16:16:10.393</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042896</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:40:08.197</property>
<property name="fileSize">15630</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">6</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042897</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:56:48.793</property>
<property name="fileSize">16838</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">7</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042895</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 17:26:19.823</property>
<property name="fileSize">14015</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042901</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 17:01:00.750</property>
<property name="fileSize">17417</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">10</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042898</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:58:29.700</property>
<property name="fileSize">16551</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">8</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042899</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 17:00:28.953</property>
<property name="fileSize">17429</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">9</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042893</id>
<property name="fileName"><![CDATA[Transmogrify Steps.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:20:46.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:20:46.573</property>
<property name="fileSize">112595</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042891</id>
<property name="fileName"><![CDATA[Device Packets.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 14:25:41.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 22:23:39.220</property>
<property name="fileSize">126700</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519698</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945007</id>
<property name="body"><![CDATA[h1. Weekly Meeting Agenda

h3. Updates Around The Table

h5. Mike M

# New HOOVES/RCP
** On hold
** Property Change listeners on Metadata classes
# Perl Module
** Writing unit tests for the generated module
# M0 Data processing
** On schedule
** Talked to Reiko, still out sick, but she responded with some stuff.

h5. Andrew

# ACE update (waiting on jar issue for SIAM)
** SIAM has asked for more of Andrew's time
# XML Editor
** On hold tll after architecture roll out
** if rollout happens soon, might be able to get done for John to use for XML for MSE Surface node.
# Caress data
** Half way finished, will finish on contingency time. Will do after perl module.
** Should be straightforward
# ANTLR (Perl module)
** This way was too much work
** Can we provide an array of Java classes, and you would carry out generation in language you are generating in.
** Other languages will be on a as needed basis.
# Benthic Rover Data Management

h5. John

# M1 Turnaround status
** M0 puck was reburned
** Waiting on the new architecture before changing.
# JSF/Web app flow
# Documentation Status
# Will be going to Hawaii

h5. Luis

# MMI status
** Luis and I have working on new architecture build running on MySQL.

h5. Mike G

# ASAP Data Systems Update

h5. Kevin

# SSDS Hours/Project Plan update
** Kevin: 126 days
** John: 40 days
** Andrew: 20 days
** Mike: 0 days
# Need project schedule for 2006
# Development
** General
*** New machine has arrived, Pete at Macworld, probably set it up next week
*** Need to draft up deployment and migration scenario for new architecture/new machine
** Web Application
*** Sputtering to life (http://ssdsdevpc:8080/ssds)
*** Meeting with ops guys this morning
** Core Metadata
*** DTS Job to copy data from old architecture to new.
*** DTS job was fixed (need perl installed on computer running Enterprise Manager, not SQL servers)
** Core Data
** Clients
** Model Integration
# MSE
** Requirements definitions
** Keith to send out email stating policy will be open if nobody says otherwise.

h3. Action Items]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912252</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042862</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:23:29.117</property>
<property name="fileSize">99838</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042863</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:28:51.077</property>
<property name="fileSize">2443</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042864</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:28:51.093</property>
<property name="fileSize">113423</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042859</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:06:05.023</property>
<property name="fileSize">2355</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042858</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:44:49.950</property>
<property name="fileSize">77389</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042861</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:23:29.107</property>
<property name="fileSize">2305</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042860</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 10:06:05.060</property>
<property name="fileSize">90560</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042855</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:41:41.017</property>
<property name="fileSize">1659</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042854</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-11-02 09:20:42.167</property>
<property name="fileSize">111714</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">6</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042857</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:44:49.907</property>
<property name="fileSize">1721</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042853</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042856</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.png]]></property>
<property name="contentType"><![CDATA[application/png]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.037</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-29 09:41:41.037</property>
<property name="fileSize">70696</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042854</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042851</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:35:53.747</property>
<property name="fileSize">18755</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">31</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042850</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:33:30.837</property>
<property name="fileSize">18955</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">30</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042853</id>
<property name="fileName"><![CDATA[mockup_Device Inspector Mockup.xml]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-29 09:41:41.017</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-11-02 09:20:42.107</property>
<property name="fileSize">2165</property>
<property name="comment"><![CDATA[auto-generated by Balsamiq Mockups. DO NOT REMOVE]]></property>
<property name="attachmentVersion">6</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042852</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:39:16.947</property>
<property name="fileSize">18782</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">32</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042847</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:28:07.813</property>
<property name="fileSize">19792</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">27</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042846</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:26:56.810</property>
<property name="fileSize">19820</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">26</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519712</id>
<property name="fileName"><![CDATA[ssdsSubmit.pl]]></property>
<property name="contentType"><![CDATA[text/html]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2009-01-13 15:20:58.300</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-13 15:22:33.870</property>
<property name="fileSize">1439</property>
<property name="comment"><![CDATA[Example of perl script to submit data packets to SSDS (in use for getM1 and getM2)]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042849</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:33:01.203</property>
<property name="fileSize">18953</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">29</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519710</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:27:20.950</property>
<property name="fileSize">21339</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">10</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042848</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:29:28.837</property>
<property name="fileSize">19789</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">28</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519706</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:59:16.940</property>
<property name="fileSize">18935</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">6</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042844</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:22:38.383</property>
<property name="fileSize">19757</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">24</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519707</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:59:41.580</property>
<property name="fileSize">19288</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">7</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042845</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:25:38.647</property>
<property name="fileSize">19804</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">25</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519708</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:02:03.677</property>
<property name="fileSize">19373</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">8</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042842</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:20:18.107</property>
<property name="fileSize">19767</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">22</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519709</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 12:02:53.957</property>
<property name="fileSize">20909</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">9</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042843</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:20:51.663</property>
<property name="fileSize">19762</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">23</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519702</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:20:16.767</property>
<property name="fileSize">961</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042840</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:56:15.640</property>
<property name="fileSize">19949</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">20</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519703</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:44:31.323</property>
<property name="fileSize">485</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042841</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:19:18.047</property>
<property name="fileSize">19763</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">21</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519704</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:50:08.717</property>
<property name="fileSize">15368</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">25395369</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">25428137</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2014-03-05 15:53:41.113</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042838</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:48:56.510</property>
<property name="fileSize">19190</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">18</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519705</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:52:50.057</property>
<property name="fileSize">15624</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042839</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:54:46.057</property>
<property name="fileSize">19450</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">19</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519698</id>
<property name="fileName"><![CDATA[Device Packets.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 14:25:41.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 10:06:00.357</property>
<property name="fileSize">195690</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">3</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042836</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:31:32.977</property>
<property name="fileSize">18876</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">16</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519699</id>
<property name="fileName"><![CDATA[Device Packets.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 14:25:41.067</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 14:25:41.067</property>
<property name="fileSize">101047</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519698</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042837</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:47:28.413</property>
<property name="fileSize">18878</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">17</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519700</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 11:49:38.193</property>
<property name="fileSize">21664</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">12</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042834</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:04:21.210</property>
<property name="fileSize">13775</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">14</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519701</id>
<property name="fileName"><![CDATA[SSDSByteArrayFormat]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 11:13:21.350</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 11:13:21.350</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519700</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042835</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:29:53.660</property>
<property name="fileSize">16137</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">15</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519694</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:31:03.813</property>
<property name="fileSize">7919</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042832</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 12:23:25.007</property>
<property name="fileSize">13792</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">12</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519695</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:33:15.910</property>
<property name="fileSize">7942</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042833</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 13:03:17.103</property>
<property name="fileSize">13773</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">13</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519696</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:36:10.163</property>
<property name="fileSize">8209</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042830</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:44:17.740</property>
<property name="fileSize">13005</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">10</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519697</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:36:38.960</property>
<property name="fileSize">8168</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">6</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042831</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:54:16.527</property>
<property name="fileSize">13792</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">11</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519691</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:40:26.533</property>
<property name="fileSize">8113</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">7</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042829</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:26:51.333</property>
<property name="fileSize">11305</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">9</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042828</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:18:13.293</property>
<property name="fileSize">10683</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">8</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042827</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:17:13.250</property>
<property name="fileSize">10032</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">7</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519693</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 13:22:10.487</property>
<property name="fileSize">8477</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042826</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 11:15:04.980</property>
<property name="fileSize">9382</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">6</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519692</id>
<property name="fileName"><![CDATA[SIAM Externalizable Structure]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-09 12:54:40.847</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-09 12:54:40.847</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519691</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042825</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:45:51.407</property>
<property name="fileSize">8134</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">5</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042824</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:20:31.320</property>
<property name="fileSize">3604</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042823</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:19:59.067</property>
<property name="fileSize">3604</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042822</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:16:49.600</property>
<property name="fileSize">534</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042821</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-27 10:16:33.607</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">11042820</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519683</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 12:17:52.990</property>
<property name="fileSize">615</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">2</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">11042820</id>
<property name="fileName"><![CDATA[Flex Client and BlazeDS Components]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-10-27 10:16:33.607</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 16:41:41.487</property>
<property name="fileSize">18736</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">33</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519682</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 12:16:39.663</property>
<property name="fileSize">133</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519685</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 13:56:16.650</property>
<property name="fileSize">11749</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">4</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519684</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-05 13:53:11.407</property>
<property name="fileSize">9132</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">3</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">8519681</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797291</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830035</id>
</element>
</collection>
<property name="version">66</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 22:40:03.890</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461536</id>
<property name="destinationPageTitle"><![CDATA[//sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.2.GA/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-09-30 13:48:58.870</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 13:48:58.870</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797292</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11830036</id>
</element>
</collection>
<property name="version">67</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-05-05 22:43:41.243</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461537</id>
<property name="destinationPageTitle"><![CDATA[//eclipse.org/downloads/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-09-30 13:48:58.870</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 13:48:58.870</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">8519681</id>
<property name="fileName"><![CDATA[SSDS JMS]]></property>
<property name="contentType"><![CDATA[text/xml]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:39.663</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-06-08 10:31:50.700</property>
<property name="fileSize">20538</property>
<property name="comment"><![CDATA[DO NOT EDIT THIS ATTACHMENT.  YOU WILL RUIN YOUR DIAGRAM!]]></property>
<property name="attachmentVersion">19</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">14647300</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.bing.com/search?FORM=MSSBMN&q=Benthic%20rover&adlt=strict]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2010-08-25 09:45:15.077</property>
<property name="lastModifierName"/><property name="lastModificationDate">2010-08-25 09:45:15.077</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5374178</id>
<property name="title"><![CDATA[UserInterfaces]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5406926</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 21:49:36.650</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-24 21:56:46.370</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">91</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17858875</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17891618</id>
</element>
</collection>
<property name="version">76</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-05-30 23:12:56.577</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">17858879</id>
<property name="title"><![CDATA[SQL 2008 Upgrade and Move to Dione]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">17891622</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-07-15 08:16:34.157</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-07-15 08:16:34.157</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17858877</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322148</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.google.com/search?q=Benthic+Rover+&rls=com.microsoft:en-us:IE-ContextMenu&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7GGLF_en]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-09-09 19:56:15.077</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-09-09 19:56:15.077</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322158</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.bing.com/search?q=Benthic+Rover+&go=&form=QBLH&qs=n]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-09-14 13:37:15.087</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-09-14 13:37:15.087</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3113031</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3178563</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2007-06-22 12:54:46.797</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322168</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://www.bing.com/search?q=Benthic+Rover&form=IE8SRC&src=IE-SearchBox]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-09-19 08:14:15.050</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-09-25 15:56:15.047</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638118</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670857</id>
</element>
</collection>
<property name="version">34</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-16 11:32:08.647</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638116</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670855</id>
</element>
</collection>
<property name="version">33</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-16 11:23:37.357</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638121</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670860</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-16 11:56:36.150</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10356010</id>
<property name="title"><![CDATA[An example use of Graphs - FOCE]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388736</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-17 09:07:20.000</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-17 09:07:20.000</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356008</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638119</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670858</id>
</element>
</collection>
<property name="version">35</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-16 11:44:30.567</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322170</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://internalindex.shore.mbari.org/search?q=benthic+rover+engineering+team&site=Web&client=MBARIFrontEnd&output=xml_no_dtd&access=a&proxystylesheet=MBARIFrontEnd]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-09-21 13:21:15.083</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-09-21 13:21:15.083</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11013138</id>
<property name="destinationPageTitle"><![CDATA[//ssdsdevpc:8080/ssds]]></property>
<property name="destinationSpaceKey"><![CDATA[(http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912252</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-12-28 13:54:14.580</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-12-28 13:54:14.580</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638114</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670853</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 11:26:43.863</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461644</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org/ssds-docs/client/]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-09-30 16:19:18.870</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 16:19:18.870</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4390913</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana.mbari.org/confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-05-28 16:21:15.083</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-05-28 16:21:15.083</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461645</id>
<property name="destinationPageTitle"><![CDATA[]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-09-30 16:19:18.870</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 16:19:18.870</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638020</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670767</id>
</element>
</collection>
<property name="version">23</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 16:30:40.587</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638022</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670769</id>
</element>
</collection>
<property name="version">24</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 16:58:43.290</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322082</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[https://internalindex.shore.mbari.org/search?q=software+license&site=Web&client=MBARIFrontEnd&output=xml_no_dtd&access=a&proxystylesheet=MBARIFrontEnd]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-08-05 15:27:15.043</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-08-05 15:27:15.043</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638016</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670763</id>
</element>
</collection>
<property name="version">21</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 16:08:56.170</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638018</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670765</id>
</element>
</collection>
<property name="version">22</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 16:22:36.500</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638012</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670759</id>
</element>
</collection>
<property name="version">19</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 14:56:59.643</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">10461643</id>
<property name="destinationPageTitle"><![CDATA[//new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061037</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-09-30 16:19:18.870</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-09-30 16:19:18.870</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1933368</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179945</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-10-04 11:10:15.357</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:10:15.357</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638014</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670761</id>
</element>
</collection>
<property name="version">20</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 15:23:49.447</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1933369</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/pages/listpages-dirview.action?key=SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-10-04 11:50:15.047</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:50:15.047</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638008</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670755</id>
</element>
</collection>
<property name="version">17</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 14:46:47.267</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638007</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670754</id>
</element>
</collection>
<property name="version">16</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 14:07:08.347</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638010</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670757</id>
</element>
</collection>
<property name="version">18</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 14:55:08.033</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322092</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.google.com/search?q=MBARI+benthic+rover&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-08-11 12:00:15.083</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-08-11 12:00:15.083</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638003</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670750</id>
</element>
</collection>
<property name="version">14</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 12:32:36.037</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638005</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670752</id>
</element>
</collection>
<property name="version">15</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 14:03:41.373</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637995</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670742</id>
</element>
</collection>
<property name="version">13</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 12:12:29.620</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638047</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670794</id>
</element>
</collection>
<property name="version">31</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 11:18:11.937</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638045</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670792</id>
</element>
</collection>
<property name="version">30</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 11:06:28.867</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">16515520</id>
<property name="destinationPageTitle"><![CDATA[//code.google.com/p/shore-side-data-system/wiki/TransmogrifyAndIngest]]></property>
<property name="destinationSpaceKey"><![CDATA[http]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-03-18 09:12:36.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:12:36.237</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">16515521</id>
<property name="destinationPageTitle"><![CDATA[bufferLen\]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-03-18 09:12:36.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:12:36.237</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638043</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670790</id>
</element>
</collection>
<property name="version">29</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 10:54:07.157</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">16515522</id>
<property name="destinationPageTitle"><![CDATA[bufferTwoLen\]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-03-18 09:12:36.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:12:36.237</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">16515523</id>
<property name="destinationPageTitle"><![CDATA[Qpid Exploration]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2011-03-18 09:12:36.237</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-03-18 09:12:36.237</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1933373</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/UserInterfaces]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-10-04 11:52:15.053</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:52:15.053</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638041</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670788</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 10:27:42.917</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638039</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670786</id>
</element>
</collection>
<property name="version">27</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 10:18:24.887</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1933370</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Developer+Docs]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-10-04 11:51:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:51:15.027</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638037</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670784</id>
</element>
</collection>
<property name="version">26</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-12 09:51:33.283</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343511</id>
<property name="viewCount">4</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">596</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:49:15.067</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-10-04 11:50:15.030</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343512</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179794</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:49:15.080</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 09:56:15.017</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343513</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Project+Memos+Minutes]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">674</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-07-03 09:49:15.080</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-07-03 09:49:15.080</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">1343502</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://oceana:8081/dashboard.action?spacesSelectedTab=all]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-06-08 14:38:15.030</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-06-08 14:38:15.030</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3638029</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670776</id>
</element>
</collection>
<property name="version">25</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 17:02:43.757</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912281</id>
<property name="title"><![CDATA[Testing TransmogrifyMDB]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945036</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:31:35.077</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637934</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670683</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:10:44.727</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912282</id>
<property name="title"><![CDATA[Testing TransmogrifyMDB]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945037</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:31:52.047</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912277</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945032</id>
</element>
</collection>
<property name="version">37</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 09:32:52.437</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637938</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670687</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:29:13.427</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912278</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945033</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 13:44:38.453</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637936</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670685</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:28:13.110</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637942</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670691</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 16:09:56.163</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637940</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670689</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:39:20.390</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637946</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670695</id>
</element>
</collection>
<property name="version">9</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 17:09:48.657</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637944</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670693</id>
</element>
</collection>
<property name="version">8</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 16:36:27.030</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637949</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670698</id>
</element>
</collection>
<property name="version">10</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 10:06:51.233</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912295</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945050</id>
</element>
</collection>
<property name="version">46</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:17:35.743</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912293</id>
<property name="title"><![CDATA[Transmogrify and Ingest Deployment]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945048</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 13:08:50.467</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:17:35.820</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356090</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912291</id>
<property name="title"><![CDATA[Ingest Deployment]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945046</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-12 13:08:50.467</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-01-12 13:08:50.467</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356090</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912290</id>
<property name="title"><![CDATA[Testing TransmogrifyMDB and Ingest]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945045</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 15:10:23.837</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912289</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945044</id>
</element>
</collection>
<property name="version">45</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:36:09.820</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912288</id>
<property name="title"><![CDATA[Testing TransmogrifyMDB and Ingest]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945043</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:36:35.997</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912286</id>
<property name="title"><![CDATA[Testing TransmogrifyMDB]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945041</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 14:31:35.077</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:33:00.657</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912285</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945040</id>
</element>
</collection>
<property name="version">44</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:35:37.247</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912284</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945039</id>
</element>
</collection>
<property name="version">43</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-13 11:26:51.553</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">22806529</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://dschool.xomcom.com/index.php/index.php?do=/profile-7323/info/]]></property>
<property name="title"><![CDATA[linked internet page]]></property>
<property name="blogName"><![CDATA[linked internet page]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2013-09-27 12:59:40.927</property>
<property name="lastModifierName"/><property name="lastModificationDate">2013-09-27 12:59:40.927</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912264</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945019</id>
</element>
</collection>
<property name="version">36</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-07 10:40:30.950</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">10485950</id>
<property name="fileName"><![CDATA[Figure 2.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:42:24.317</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:42:24.317</property>
<property name="fileSize">514578</property>
<property name="comment"><![CDATA[An example of the configuration table list]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">11013509</id>
<property name="destinationPageTitle"><![CDATA[Transmogrify and Ingest Deployment]]></property>
<property name="destinationSpaceKey"><![CDATA[SSDS]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912280</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-01-04 16:17:35.810</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 16:17:35.810</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637988</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670735</id>
</element>
</collection>
<property name="version">11</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 11:18:20.140</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637992</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670739</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 12:10:11.680</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322228</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.bing.com/search?q=how+does+benthic+rover+work&go=&form=QBRE&qs=n]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-10-08 21:22:15.097</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-10-08 21:22:15.097</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797075</id>
<property name="title"><![CDATA[April 27, 2010]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829828</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:32:49.873</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:32:49.873</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797073</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797077</id>
<property name="title"><![CDATA[April 27, 2010]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829830</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-27 15:32:49.873</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:33:29.950</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797073</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797078</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829831</id>
</element>
</collection>
<property name="version">49</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-27 15:24:47.257</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355897</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388623</id>
</element>
</collection>
<property name="version">4</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:38:15.483</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355898</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388624</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:39:55.963</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355895</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388621</id>
</element>
</collection>
<property name="version">3</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:16:51.717</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">10485949</id>
<property name="fileName"><![CDATA[Figure 1.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:37:51.760</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:37:51.760</property>
<property name="fileSize">217375</property>
<property name="comment"><![CDATA[Connecting to the SSDS_Data database]]></property>
<property name="attachmentVersion">1</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355894</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388620</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:06:45.350</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355891</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388617</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:06:45.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797069</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829822</id>
</element>
</collection>
<property name="version">48</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-26 14:58:36.523</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912357</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945103</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-07 17:00:06.230</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355902</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388628</id>
</element>
</collection>
<property name="version">7</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:46:37.537</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355900</id>
<property name="title"><![CDATA[How to Configure Graphs]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388626</id>
</element>
</collection>
<property name="version">6</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-08-11 16:05:27.267</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-11 16:42:45.837</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355890</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912348</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945095</id>
</element>
</collection>
<property name="version">40</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-05 14:25:35.847</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355912</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388638</id>
</element>
</collection>
<property name="version">42</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-08-13 11:26:25.690</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912347</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945094</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 14:21:04.847</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355911</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388637</id>
</element>
</collection>
<property name="version">41</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2009-01-13 13:47:22.177</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10912354</id>
<property name="title"><![CDATA[Data Services]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10945101</id>
</element>
</collection>
<property name="version">5</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-22 10:36:03.900</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2009-10-28 17:27:14.280</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912971</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5374188</id>
<property name="title"><![CDATA[Matlab 2008a Integration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5406935</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[brian]]></property>
<property name="creationDate">2008-06-17 16:49:15.183</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-06-17 16:49:15.183</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374184</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">5374189</id>
<property name="title"><![CDATA[Matlab 2008a Integration]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">5406936</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[brian]]></property>
<property name="creationDate">2008-06-17 16:49:15.183</property>
<property name="lastModifierName"><![CDATA[brian]]></property>
<property name="lastModificationDate">2008-06-17 16:50:38.653</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374184</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797060</id>
<property name="title"><![CDATA[Migration to Google Code Base]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829813</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2010-04-26 16:05:08.450</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-26 16:05:08.450</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797058</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637927</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670677</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 14:59:30.507</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">3637930</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">3670680</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:07:56.753</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797054</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829807</id>
</element>
</collection>
<property name="version">47</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-04 17:02:19.407</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915259</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4948022</id>
</element>
</collection>
<property name="version">38</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:48:13.507</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">3735607</id>
<property name="fileName"><![CDATA[Before Cleanup Deployment.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 15:07:00.377</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-07 15:07:00.377</property>
<property name="fileSize">298209</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">1</property>
<property name="originalVersion" class="Attachment" package="com.atlassian.confluence.pages"><id name="id">3735602</id>
</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">3735602</id>
<property name="fileName"><![CDATA[Before Cleanup Deployment.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 15:07:00.377</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-08 13:53:10.010</property>
<property name="fileSize">440368</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">2</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915267</id>
<property name="title"><![CDATA[Internal Application Consolidation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4948030</id>
</element>
</collection>
<property name="version">39</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-07 14:59:30.507</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-05 13:13:29.093</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">10355691</id>
<property name="title"><![CDATA[Benthic Rover Data Management]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">10388419</id>
</element>
</collection>
<property name="version">12</property>
<property name="creatorName"><![CDATA[graybeal]]></property>
<property name="creationDate">2009-07-31 11:41:34.023</property>
<property name="lastModifierName"><![CDATA[graybeal]]></property>
<property name="lastModificationDate">2009-08-03 00:45:38.607</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944585</id>
<property name="body"><![CDATA[I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

A more detailed view with examples of configuration files can be seen here:

{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911819</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797149</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829897</id>
</element>
</collection>
<property name="version">41</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-01-05 14:33:23.970</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797151</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829899</id>
</element>
</collection>
<property name="version">42</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 10:05:17.080</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">238</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[http://wiki.mbari.org/ssds/moin.cgi]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2007-01-24 09:23:15.067</property>
<property name="lastModifierName"/><property name="lastModificationDate">2007-06-21 09:46:15.063</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797153</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829901</id>
</element>
</collection>
<property name="version">43</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 11:47:17.337</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797155</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829903</id>
</element>
</collection>
<property name="version">44</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 11:57:06.707</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379787</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://szybkapozyczkadlazadluzonychbezbik.blogspot.com/]]></property>
<property name="title"><![CDATA[szybka poÅ¼yczka dla zadÅ?uÅ¼onych bez bik gra]]></property>
<property name="blogName"><![CDATA[szybka poÅ¼yczka dla zadÅ?uÅ¼onych bez bik gra]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-10 20:45:58.237</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-10 20:45:58.237</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">11797157</id>
<property name="title"><![CDATA[Ingest Architecture]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">11829905</id>
</element>
</collection>
<property name="version">45</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2009-01-05 12:16:17.787</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2010-04-29 11:58:11.757</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355863</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944600</id>
<property name="body"><![CDATA[# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
# Workflow/Automated
## [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911836</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915257</id>
<property name="title"><![CDATA[Welcome to the Shore Side Data System Project]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4948020</id>
</element>
</collection>
<property name="version">43</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.643</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 10:40:48.417</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915255</id>
<property name="title"><![CDATA[ProjectDocuments]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4948018</id>
</element>
</collection>
<property name="version">28</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 15:54:04.350</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944612</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|6}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911848</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13369349</id>
<property name="body"><![CDATA[The purpose of this component is to allow users to upload a file to the SSDS and have the SSDS parse the file as best it can and then present a form to the user so they can fill in the necessary metadata about the file.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13336581</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915202</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4947970</id>
</element>
</collection>
<property name="version">57</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-03 13:17:05.313</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">4915201</id>
<property name="title"><![CDATA[Tasks]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4947969</id>
</element>
</collection>
<property name="version">56</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2007-06-22 13:07:08.573</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-05-30 11:51:34.147</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849689</id>
<property name="viewCount">3</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/display/SSDS/ProjectDocuments]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-03 13:17:15.030</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-05 12:56:15.037</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849688</id>
<property name="viewCount">2</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/pages/editpage.action?pageId=1179738]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179738</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-03 13:17:15.027</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-03 13:18:15.037</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379703</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.youtube.com/watch?v=YG1R1tdtMJg]]></property>
<property name="title"><![CDATA[this contact form]]></property>
<property name="blogName"><![CDATA[this contact form]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-09 01:00:41.677</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-09 01:00:41.677</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">4849675</id>
<property name="viewCount">7</property>
<property name="url"><![CDATA[https://oceana.mbari.org/confluence/dashboard.action]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2008-06-03 12:48:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-06-09 09:39:15.023</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830450</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

h3. Documents
# We got a document from science about QC plots which is attached here [Mooring QC Plot Requirements (Word)|^Mooring_Quality_Contr#F4B3C.doc|Mooring QC Plot Requirements (Word)].
# This is the same document but John G added categories to try and organize them into group: [John G's Categorization (Word)|SSDS:ProjectRequirements^Mooring_QC-QL_plots.doc]
# Also a spreadsheet about data processing and analysis for the instruments on CIMT [Data Processing and Analysis for CIMT (Word)|^Data_Processing_Analysis.doc]

h3. Meeting Notes
# [2004-04-20 CIMT SSDS Meeting Notes]

h3. Requirements]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797681</id>
</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379733</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://wmxs888888.com]]></property>
<property name="title"><![CDATA[m88]]></property>
<property name="blogName"><![CDATA[m88]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-10 04:57:59.257</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-10 15:13:32.080</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830458</id>
<property name="body"><![CDATA[Issues Identified Before and During 2004.04.20 CIMT/SSDS Meeting

# Q: One of the items is to pass data to/from the SSDS. Does that mean that we (CIMT) are responsible for reproducing the same types of plots and such that MBARI is already creating internally?  Or is it possible to combine these two processes?  
## A: Both processes can be combined.  The "passing data from and to" is to enable automated non-SSDS processing.
# #13 on the prioritization list should be bumped up a bit...if we can't get through the firewall to see the data we are going to get negative feedback from NOAA.
## Understood. Is in fact in progress.
# Are we planning on a watch circle type plot for GPS?
## Yes (though note it is in the custom plots category, Priority #16).
# Is tic mark beginning of day? 
## Yes, midnight on that day. These formats can be changed.
# How is development affected by selection of particular plotting package (e.g., JFreeChart) to support SSDS requirements? 
## It affects how our internal services work (e.g., the callable interface we're using for this demonstration), but users are expected to download data (via TBD interfaces) to work with more advanced applications.  
# How will user know what URL to specify to get what they want?  
## At first by asking us, but soon enough by filling out a query form (which will then generate a URL, and the URL can be modified and reused).
# Concern about query page being time-oriented.  Can't we make it easy to do this by region too (i.e., lat/lon/depth)?  You do need to consider this for CIMT, but a simple (nominal) concept is probably all we should do at first.  It doesn't have to be embedded in data, but incorporated in header of a plot. SSDS should eventually be able to query on these 4 parameters: time, lat, lon, depth.
## Points well taken. Please note this is hard, and not on the priority list.
# How do you envision getting data from this system on a recurring basis?  This could be used, for example, to connect two data systems together. This is Likely to be common.
## We have to design this feature (see Priorities #5 and #8).
# Would be nice to be able to give feedback about the data, so that the feedback lives with the data.  
## This is a significant operational challenge across the board at MBARI.  But, the architecture we have could be tuned to such a thing.  (There are 3 distinct parts to this request; routine automated QC flagging; injecting comments during post-processing, manually or automatically; and user feedback on existing data. The last might be accomplished by publishing the "instrument owner" with the plots.)  Note this is not on the priority list.
# Why can't we query more/better/sooner?  How about directly querying the database?  Point and click query access can wait, but developer queries must be supported soon.  (When will they be available?)
## An interface which can support at least some developer queries will be available sometime 'soon' (at its most basic possibly within a few weeks).  That kind of interface is implied in Priorities #3, #5, #8, #11, #12, and #16.  The query documented by Priority #14 is the point-and-click type.
# Processing data internally, by moving currently external processing into SSDS, is desirable (e.g., for Metsys and other Bahr data).
## We are evaluating all the external processing requirements before proceesing on Priority #8, but my (John G) first approach is to work with existing interfaces as much as possible, for the sake of speed.
# Add lookup by platform name to device table front end.
## Good idea.  Have it mind, but not on the priority list.
# Not clear how to get to a specific data variables/data sets. An interface to 'query for data' is needed, but it isn't on the priority list. (How to describe this need, in the context of the priority list, isn't clear.)
## We will be better able to respond to this, and consider what priority it should have, at the next User Story meeting.
# What time frame are you likely to have some of this work done -- do you even know?
## We have a decent idea.  We expect to be one more step toward a final solution for #8 and #9 by the next User Story meeting on 5/6/04, with a prototype to review.  Also at that meeting, we may have significant progress on one or all of the following (current status in parentheses):
 #10: (solution in mind, implementation in progress)
 #11: (prototype demonstrated today, wider access intended by 5/6)
 #12: (notional solution in mind)
 #13: (PC in house, final architecture still undetermined)
 #16: (none currently developed, but this wouldn't be hard, especially with a collaborator)
Status of infrastructure items:
 #1: Done for many cases, some cases still in progress.
 #2: In progress, 5 MTM instruments described.
 #3: Example demonstrated today, some enhancements needed for end users, and still needs to be "released" and possibly put service outside firewall.
 #4: Coding can now begin once agreed SIAM metadata interface is documented.
 #5: Prototype developed, considerable standardization remains.
 #6: In research.
 #7: No activity.


h3. Identified/Prioritized User Stories (with caveats).

Items 1-7 are infrastructure services.  Most will serve any ingested and described data. Items 8 and beyond are specific CIMT implementations/utilizations of the infrastructure services.

Rough scope is indicated in brackets: A=5 work days, B=5-10 work days, C=10-20 work days.

h5. Done
* Ingest raw SIAM data packets.
* Manage metadata for data packets (basic infrastructure; minor mods needed for CIMT).
* User accesses raw data packets via web (in place for MTM2; tuning needed for CIMT).
* Prototype tool available to confirm consistency of data.

h5. Infrastructure
* Parse ASCII streams [A]
* Define metadata describing data [B]
* Create general web plotting capability (to support QC-style, parameter vs time plots only) [C]
* Simplify SIAM data ingest (internal, no visible behavior change) [B]
* Add Data notification mechanism or mechanisms (to maximize # of external processes served data) [B]
* Add data submission mechanism or mechanisms (to maximize # of external processes submitting data) [B]
* Create a general query interface (expect only one or two basic queries supported for CIMT; see #15 below) [B]

h5. CIMT-Specific
* Provide data to specific external processes (TBD which ones) [B]
* Accept data from specific external processes (TBD which ones) [A]
* Ingest SOON data as a data stream [B]
* Provide basic plots of raw data (note more advanced plots were deemed not critical by deployment) [A]
* Merge items according to timestamp, optionally at a given time interval. (Focused on data.)[B]

h5. Not sure

The following 4 items are on the bubble'; ideally all 4 can be accomplished, but possibly none of them can, depending on speed of the first 12 items. (I expect 2 of these can be done.)
* Make plots available outsisde the firewall (i..e, publicly available) [B]
* Provide point-and-click query for data sets according to instrument providing the data. [A]
* Obtain a subset of the data within a particular time interval (ideally including non-SIAM data). [B]
* Add customized raw plots (e.g., to QC more sophisticated systems). [B]

Corrections and modifications are encouraged, now or at any User Story meeting.

h3. 2004.04.20 Feedback
# How to access, by instrument or?  
# Go with something more legible for non-specialist.
# Operational diagnostics under one heading, science variables under another heading.
# Minimize number of variables (don't show redundant ones).
# Preconfigure list of most interesting variables.
# There really should be a way to do our own groupings, not be limited to fixed layout.
# A week is reasonable standard duration.
# Would be really useful to have a contact responsible to guide the layout of the primary page.
# Like to have date axis on top and bottom (or every so often).
# How do we get data?
# Confusing to get it from too many pages? Easy to access if there's a button on the page.  
# Would make more sense if redirected to a query page, allow changes to be made.
# Provision for providing feedback about data would be valuable. (See Issues doc.)
# Indicate data gaps.  Could just plot points.  Give user an option as to how to plot.
# Would like to know reason for the gap.
# Post-processing can help.
# Maybe use sequence number.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797689</id>
</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">18579773</id>
<property name="title"><![CDATA[SSDS Project Documentation]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">18645288</id>
</element>
</collection>
<property name="version">77</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-24 15:12:15.247</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2011-07-15 07:39:39.473</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">18579772</id>
<property name="title"><![CDATA[Debugging quick look and contour wind stick plots]]></property>
<collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">18645287</id>
</element>
</collection>
<property name="version">32</property>
<property name="creatorName"><![CDATA[mccann]]></property>
<property name="creationDate">2011-05-30 20:39:26.043</property>
<property name="lastModifierName"><![CDATA[mccann]]></property>
<property name="lastModificationDate">2011-06-03 15:41:37.193</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236005</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">4882506</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[VIEWSPACE]]></property>
<property name="group"><![CDATA[Onsite Distribution List]]></property>
<property name="userName"/><property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-03 12:47:41.020</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-03 12:47:41.020</property>
</object>
<object class="SpacePermission" package="com.atlassian.confluence.security">
<id name="id">4882507</id>
<property name="space" class="Space" package="com.atlassian.confluence.spaces"><id name="id">2</id>
</property>
<property name="type"><![CDATA[COMMENT]]></property>
<property name="group"><![CDATA[Onsite Distribution List]]></property>
<property name="userName"/><property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-06-03 12:47:47.410</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-03 12:47:47.410</property>
</object>
<object class="Attachment" package="com.atlassian.confluence.pages">
<id name="id">3735622</id>
<property name="fileName"><![CDATA[After Cleanup Deployment.jpg]]></property>
<property name="contentType"><![CDATA[image/jpeg]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637922</id>
</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-05-16 13:41:42.110</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2008-06-09 09:36:53.140</property>
<property name="fileSize">345273</property>
<property name="comment"><![CDATA[]]></property>
<property name="attachmentVersion">2</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">206</id>
<property name="viewCount">8</property>
<property name="url"><![CDATA[http://oceana:8081/display/SSDS/Welcome+to+the+Shore+Side+Data+System+Project]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">80</id>
</property>
<property name="creatorName"/><property name="creationDate">2006-12-01 15:01:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-01-10 09:34:15.090</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">205</id>
<property name="viewCount">33</property>
<property name="url"><![CDATA[http://oceana:8081/dashboard.action]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10</id>
</property>
<property name="creatorName"/><property name="creationDate">2006-12-01 15:01:15.023</property>
<property name="lastModifierName"/><property name="lastModificationDate">2008-04-03 14:00:15.150</property>
</object>
<object class="TrackbackLink" package="com.atlassian.confluence.links">
<id name="id">24379751</id>
<property name="viewCount">0</property>
<property name="url"><![CDATA[http://www.thefatburningchefreview.com/]]></property>
<property name="title"><![CDATA[link webpage]]></property>
<property name="blogName"><![CDATA[link webpage]]></property>
<property name="excerpt"><![CDATA[Benthic Rover Data Management - Confluence]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355664</id>
</property>
<property name="creatorName"/><property name="creationDate">2014-02-10 10:50:08.147</property>
<property name="lastModifierName"/><property name="lastModificationDate">2014-02-10 10:50:08.147</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093796</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule
# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061034</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093798</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061036</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093801</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# Publishing other non-SIAM data to SSDS]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061038</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093803</id>
<property name="body"><![CDATA[These are the instructions for "shoe-horning" non-SIAM infrastructure data streams into SSDS.\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061040</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093805</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.


h2. \\


h2. Create XML description of the Platform and Instrument deployment

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommened for producing valid and

{noformat}
<?xml version="1.0" encoding="UTF-8"?>

<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.3 2008/12/17 00:49:01 mccann Exp $	-->

<!-- Last edited by $Author: mccann $   -->

<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://dods.mbari.org/data/ssdsdata/config/schema/2004oasis/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/17 00:49:01 $">
    <Deployment role="platform" name="EITS on MARS (Test2)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>


{noformat}


h2. &nbsp;]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061042</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093807</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.


h2. Create XML description of the Platform and Instrument deployment

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:
 * A Deployment with role="platform" must be the outer element.
 * Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
{code}
<?xml version="1.0" encoding="UTF-8"?>

<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->

<!-- Last edited by $Author: mccann $   -->

<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n" recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}\\
# Submit the Metadata to SSDS using the SSDSLoads application

h2. Publishing data to SSDS
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061044</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093809</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Create XML description of the Platform and Instrument deployment

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:

* A Deployment with role="platform" must be the outer element.
* Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
* Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
* Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
* Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>

<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->

<!-- Last edited by $Author: mccann $   -->

<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n" recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
Submit the Metadata to SSDS using the SSDSLoads application



h2. Publishing data to SSDS]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061046</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212503</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana.shore.mbari.org:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179736</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093811</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Create XML description of the Platform and Instrument deployment

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:

* A Deployment with role="platform" must be the outer element.
* Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
* Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
* Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
* Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>

<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->

<!-- Last edited by $Author: mccann $   -->

<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}

# Submit the Metadata to SSDS using the SSDSLoads application

h2. Publishing data to SSDS]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061048</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959178</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server and it will bind to 0.0.0.0 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless=true -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926410</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212504</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana.shore.mbari.org:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]

Tasks:

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179737</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093812</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:

* A Deployment with role="platform" must be the outer element.
* Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
* Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
* Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
* Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>

<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->

<!-- Last edited by $Author: mccann $   -->

<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
*# Submit the Metadata to SSDS using the SSDSLoads application



h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061049</id>
</property>
</object>
<object class="SpaceDescription" package="com.atlassian.confluence.spaces">
<id name="id">18</id>
<property name="title"/><collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">16</id>
</element>
</collection>
<property name="version">1</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.420</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-17 21:39:33.420</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">9</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093813</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:

* A Deployment with role="platform" must be the outer element.
* Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
* Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
* Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
* Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# Submit the Metadata to SSDS using the SSDSLoads application

h2. Establish data publishing application
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061050</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212506</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
h3. Critical (20 days total)
# Finish architecture migration:
## Finish Update``Bot
### Resource``Type (contentLength, mimeType)
### Get Standard``Variable and Standard```Unit lists to stay in synch with CF/UNIDATA
## Verify all data of interest for MSE is being plotted
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart

h3. Great to have done this year (15 days)
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages

h3 Could be in tasks for MSE Support, but if not, still need to get done (20 days - These would alleviate some of the MOOS time for 2007))
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)

h3. OOI Interaction (20 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email {{{
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller}}}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email{{{
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
}}}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179739</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093815</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:
* A Deployment with role="platform" must be the outer element.
* Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
* Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
* Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
* Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# Submit the Metadata to SSDS using the SSDSLoads application

h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061052</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093816</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
# {code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}

# Submit the Metadata to SSDS using the SSDSLoads application

h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061053</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212502</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MTM-3 Web App|http://ssdspub.mbari.org:8080/mtm3]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana.shore.mbari.org:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179735</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093818</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deplyment of the Eye In The Sea deployment. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# Submit the Metadata to SSDS using the SSDSLoads application

h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061055</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093820</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# We recommend checking in the final XML to the puckxml module in MBARI's CVS.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}

h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061057</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093822</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# We recommend checking in the final XML to the puckxml module in MBARI's CVS.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded

h2. Establish data publishing application]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061059</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212507</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
h3. Critical (20 days total)
# Finish architecture migration:
## Finish Update``Bot
### Resource``Type (contentLength, mimeType)
### Get Standard``Variable and Standard```Unit lists to stay in synch with CF/UNIDATA
## Verify all data of interest for MSE is being plotted
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart

h3. Great to have done this year (15 days)
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.

h3. Could be in tasks for MSE Support, but if not, still need to get done (20 days - These would alleviate some of the MOOS time for 2007))
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)

h3. OOI Interaction (20 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179740</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212508</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Finish architecture migration:
## Finish Update``Bot
### Resource``Type (contentLength, mimeType)
### Get Standard``Variable and Standard```Unit lists to stay in synch with CF/UNIDATA
## Verify all data of interest for MSE is being plotted
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179741</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093824</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
# {code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            Ê
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond,
																	// Pres, U,
																	// V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}

{code}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061061</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212509</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Finish architecture migration:
## Finish Update``Bot
### Resource``Type (contentLength, mimeType)
### Get Standard``Variable and Standard```Unit lists to stay in synch with CF/UNIDATA
## Verify all data of interest for MSE is being plotted
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?reset=true&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179742</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093826</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
# {code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond,
																	// Pres, U,
																	// V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061063</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212522</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds

h3. Clients
# Migrate HOOVES to new architecture

h3. Web application

h3. Other
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179755</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212521</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Finish architecture migration:
## Finish Update``Bot
### Resource``Type (contentLength, mimeType)
### Get Standard``Variable and Standard```Unit lists to stay in synch with CF/UNIDATA
## Verify all data of interest for MSE is being plotted
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179754</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212530</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).

h3. Graphing Application
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)

h3. Clients
# Migrate HOOVES to new architecture
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179763</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212527</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.

h3. Clients
# Migrate HOOVES to new architecture
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned DataContainer collections should be sorted by start date as default
# Query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Finish architecture migration:
## Finish UpdateBot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.
# Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179760</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212526</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer

h3. Clients
# Migrate HOOVES to new architecture

h3. Other
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned DataContainer collections should be sorted by start date as default
# Query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Finish architecture migration:
## Finish UpdateBot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.
# Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179759</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212524</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds

h3. Clients
# Migrate HOOVES to new architecture

h3. Web application

h3. Other
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179757</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212523</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds

h3. Clients
# Migrate HOOVES to new architecture

h3. Web application

h3. Other
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Create a page in new web app that shows/edits listing of Device``Types
# Increase session timeout in Explorer
# Look at AUVCTD portal code and make sure it survives an SSDS restart
# Make sure whatever components assign ResourceTypes have a valid way to associate file extensions with mimeTypes
# Lookup standard variables and standardUnits from UCAR and have UpdateBot style mechanism add them to those without.
# GoogleMaps/GoogleEarth/Worldwind integration
# Build code to read data from Data``Files through the query interface (not just from packets).
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring.
# Put UML diagram of data model on developer section of web app.
# Implement a mechanism that updates the true end date/time on the Data``Container for data streams to show the latest data for each stream (This will affect MMI as well as the pages that show when last data was received, like SIAM raw data access page).  This should also update the number of records and the stream should probably somehow reference the SQL data packets.
# Configure Build/Code to make distributable and compatible with Mac (5 days)
## Put Copyright in all SSDS source code and zip up to put on web site
# Put link to post processed data on base CIMT pages
# Refactor navigation menus and scheme for SSDS site and post processed pages
# Build web pages that all user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Finish documenting data packet structure on web pages.
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Follow up on PUCK configuration tool (ACE)
# Verify that wrapper generator unit test are on during test target of build.
# Put copyright in all code.
# Export project to open source repository.
# QC Pages
## show instruments removed for service or currently reflecting invalid data (e.g., cover left on) (John has notes of which)
### show expected turn-on date if known (note: would have to keep this up)
### add "Planned availability xxxx" to missing data and displays on website so appears more individually organized to users then just a generic "data not available"
## show processed QC data wherever available -- this is very valuable feature
## fix graphs that don't size correctly on Mark's machine (probably cross-platform browser problem)
## look for other cross-platform issues
## fix multispectral page heading (says "Backscatter/chlorophyll")
## on chlorophyll page, turbidity isn't presented (get plots working)
## add ISUS data (get plots working)
## add parsing of Medusa data where possible
## make first page to load the MSE Sites page rather than the Domains page
### Benthic nodes in Sites pages have some instruments not actually on node (check)
## Update anchor as-deployed position (MSE anchor is 36.218321° N -122.904986° W)
## Scale both axes equally on GPS plots that are scaled to data.
## Make all metadata (.xml) links work
### Be nice if metadata page were improved (why not put files in body of page?)
## Improve graph names on plots (particularly on power pages, n.b., "ADCnn")
## Correct the formatting of titles on plots (add spaces for clarity)
## Add portal data items (particularly Globalstar download durations) to data pages when available
## Delete Diagnostics page
## Add GPS plot showing location since deployment
## Change "Platform Environment" to "Platform Status" throughout
## need to show plots of summary data on these pages as soon as reasonably possible
## fix CTD post-processed plots that aren't updating (point to 20060502 instead of 20060503)
## Sure would be nice to see the real wind direction (must be computed)
## Be nice if QC plots knew to pick pen up when data is skipped
## Multiple variables on one axis is desirable (e.g., for Ed M)
## Consider deleting Sensor pages
# Other Actions
## Mark: make links from MSE and MOOS web sites to SSDS MSE pages (update those sites)
## Mark: Review words at http://ssdspub.mbari.org:8080/mse/index.jsp
## Mark: send updated anchor location to Graybeal for watch circle plot
## Tom/SIAM: add SIAM infeastructure information to SSDS as SIAM packets
### Globalstar ppp info
### clock offsets
## Kevin: confirm SIAM Packets is the right way to add the SIAM infrastructure data
### provide mechanism for ISI ID or other data source ID
## TBD (McCann et al?): Aquadopp post-processing very desirable
## Tom/John: provide serial info to Paul for MSE GPS, discuss MTM3 GPS serial/ISI number issues w/him
### Tom: fix appropriate node to reflect correct GPS ISI ID
### Kevin: move data appropriately
### John: confirm primary GPS plots update correctly, put primary plots at top again
## Kevin: turn off fail-mail for missing sensors
## John: send missing sensor list
## Kent, Tom: look at the download times (vs. the real budget) and figure out what to do
## John: write XML translator for summary data (check w/Kevin first)
## John: note who is doing which post-processing somewhere (keep track)
# Other Notes
## SOON post-processing data should be publicly displayed if possible, encourage scientists to do this.  
### Raw data by itself cannot be interpreted or ground-truthed by anyone but instrument builder. 
### MSE policy is for all MSE data to be publicly available.
## Enthusiasm expressed for post-processed data
## Enthusiasm expressed for ability to drill down to deployed sensors and their data using Explorer
## The existing diagnostic info on sensor pages (e.g., on LWR) is just fine
## Desire in long term for common 'status reporting' system for instruments
## Need to clean up presentation of left navigation on main SSDS page
## Need to add rest of SSDS web page content to main SSDS pages
## Being able to search and sort instruments by current location/deployment is extremely valuable
# Refactor/overhaul chart creation application
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup Device``QCPlot``Creator to create plots with multiple lines on one chart (and separate axes).
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# Implement Query "I want the Air Temperature (Standard``Variable.name) from the Data``Producer named "M1" from such and such to such and such a time."
# Query: Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data``Producer of type Deployment?
# Query: Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Figure out how we will integrate data files offloaded from instruments when they are recovered.
# Site Based Pages for MSE (4 days)
# Possibility of direct support of ESB work with NCSA/LOOKING

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Verify Done
# Add boolean to all query methods for returning full object graphs.
# Implement methods to returns counts on queries.
# Add capability of specifying what to sort results by (property name) in the query methods.
# Returned Data``Container collections should be sorted by start date as default
# Query for Data``Container by Data``Container``Group
# Make sure XML dates that are coming out of XML``Builder/Object``Builder cycle can be parsed by the XML``Date``Format.
# Check Object Builder/XML builder to make sure it handles URI/URL/Uri``String/DODS``Url/X/Y/Z``offsets correctly.
# Make sure object Schema/Object``Builder/XML``Builder only use one Data``Container/Data``Producer for output, input, consumer, tags.

h3. Completed Tasks
# Finish architecture migration:
## Finish Update``Bot
### Source/Destination tracking for flagging NetCDF creation
### Email after processing
## Change unique key definition on Standard``Variable code
## Rebuild code, deploy on ssdsdevpc and let it build database on Fog.
## Fix/Run DTS to accomodate the new alternate primary key on Standard``Variable to be name and namespaceUri and copy data from SSDS on Solstice to SSDS_Metadata on Fog.
## Rebuild code base, deploy to new-ssds and let code build DB on Solstice SSDS_Metadata. (TURN OFF MESSAGING EMAIL TILL AFTER MIKE DOES STANDARD VARIABLE UPDATES).
## Rebuild code base, redeploy with Create DB off.
## Change DTS job from Fog->SSDS_Metadata to Solstice->SSDS_Metadata to match the one used for SSDSDevPC and run.
## Startup new-ssds jboss.
## Run all MSE Urls.
## Have Mike run Stanard``Variable updates.
## Rebuild code and deploy with messaging turned back on.
## Verify all data of interest for MSE is being plotted
## Move MTM3 web apps to same form as MSE.
## New Device creation/editing page
## New Person creation/editing page
## Point old jsp's to new jsp's
## Point old Get``Original``Data``Servlet (ssds.shore and ssdpsub) to new Get``Original``Data``Servlet
## Migrate HOOVES.
## Shut off ruminate on predator.
## Shut off cimt on predator.
## Undeploy all SSDS stuff except for access.war that has forwards in it.
## Verify what Luis is using for Salinity is just Get``Original``Data``Servlet.
## Leave for a bit, but remove SSDS from solstice.
## Remove SSDS from Fog.
## Clean out do fresh installation on prey (retask).
## Turn off replication of data from tornado to ssdspub
## Remove SSDS data database from SSDSPub and all that should remain is a few .war files pointing to new-ssds.
## Ensure M0 PC02 Plots working (M0 Turnaround)
# Break up deployments in metadata for Mooring into pre-deployment and deployment (M0 is the real issue) (no progress, re-iterated by Francisco)
# In build, fix so that the jsf-lib directory is removed and install jstl.jar & standard.jar
# What is the official MSE name? (MTM Meeting next week).
# Find NetCDF Files for CIMT data and send URLs to Brian Fulfrost
# Web page access to data from final ADCP netcdf file (Mike M completed)
# Find location and put XML schemas (and associated DTD's out on the public web).  Also include that as part of the build process (http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd)
# Add uri attribute to Standard``Variable (Valid URI)
# Alternate primary key on SV (name, uri)
# Can we implement a method on Process``Run``Access that can do cascade deletes? (done in new architecture on Data``Producer``DAO and is called "deepDelete")
# "I'm calling Process``Run``Access.update() with additional inputs and they are not getting added.  (new architecture does this)
# Get the graphs on the CIMT web site working with device 1480.
# The Time/Date box in the SIAM``Raw``Data``Access``Page states it is PST, but that is no longer true since we moved to having the Jboss instance running in GMT.
# Implement findWithinDateRange() (Mike M) method is called findByDateRangeAndName and can be invoked with null name to just search by date.
# Implement findByDataProducerGroupName() [remove findByLikeDataProducerGroupName() & other ..like.. methods] (Mike M)
# Return count methods, e.g. countOfFindByDataProducerType() (Mike M) (ongoing, but done for the ones listed here)
# findByLikeNameWithinTimeAndWithinGeospatialCube() [remove the ..like.. & use exactMatch boolean] (Mike M) (Done and method is called findByNameAndTimeAndGeospatialCube).
# Would these countOf...() methods be easy to implement?  They would sure be handy to have from a user interface perspective. (Mike M) (Done for the ones in this completed section, but still an ongoing effort).
# Add Resouce``BLOB to Resource (Andrew).
# Add Keywords to Data``Container through servlet (Andrew) (This should work now, but not really tested)
# Query for Data``Container by Keyword (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Query for Data``Container by Lat/Lon and by time (Andrew) (Done, but I am going to refactor to implement one query method like I did in Data``Producer``DAO).
# Object/XML Builder done for new architecture.
# Metadata``Access``Servlet updated for new architecture
# Fixed bug in Metadata``Factory to return primitive classes when primitive text is passed in.
# Fixed DTS job to copy from old database to new on Fog (1/11/2006)
# Change SSDS so it can handle new Summary``Packet from SIAM.  No change was necessary as Tom is exporting Summary``Packets as Sensor``Data``Packets
# Figure out if we need to submit any text for SSDS Project for Annual Report (due 2/1)
# Get Andrew's Metadata``Access``Servlet documentation up on servlet and/or ssds web application
# Write up new architecture and migration path for new machine and architecture deployment.
# Simplify operation tasks (startup, shutdown, health, etc.)
# Document requirements for data access for MSE and get those and schedule to Keith
## Talk to Charlie, Jim Barry, Bill Ussler, Rendy, Chris Lovera about how they process data from the instruments currently.
## Create list of UI goals for this (and beyond) and figure out taks/skills for that.
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## On plots, link sensor manufacturer and model and put on plot itself (if possible)
## If min/max value exist for record variables, clip generated plots to those values. Also can use the new displayMin/displayMax variables where data gaps are)
# Look into Ken's suggestion about ID's for deployment.  From his email 
{noformat}
All, When looking at the raw data in SSDS is can be very difficult to figure out what 
is what mooring and will get even more so as time goes by.  This email is an attempt 
to get discussions going on how to deal with eliminating the confusion. All instruments, 
including controller cans can (and have been) be swapped during the deployment.  It 
would be nice to have an ID for each deployment i.e.  2004 M0, 2005 M0, 2005 M2.If this 
ID were set up in the can as the parent ID just before deployment (i.e. aboard ship on 
the way out), then the problem of trying to separate out test data from deployed data 
would be easier to manage.  It should also help resolve the issue of having latitude and 
longitude data in pucks.  Instead the mooring ID would have the location associated with it. 

Regards, Ken Heller
{noformat}
# Implement Query: Find all instruments currently deployed on a "deployment"
# Implement Query: They want to be able to selectively view only Metdata``Packets (Record``Type) and find only the most recent one.
# Implement Query: They want a way to know what is currently deployed (user interface).
# Fix Java``Script bug in SIAM Raw Data Access Page: This is a bug that Andy Hamilton showed me.  When you select start to end time option, the get data, then click on back, the Javascript diables some of the time selection fields, which then invalidate the query and if you try to get the data again, you get a Null``Pointer``Exception.
# Follow up with ops group with meeting on ID's, device, sensors, etc. and clean up device DB in SSDS
# Add way to lookup instruments by platform on the device table
# Merge access method (SIAM``Raw``Data``Access and Get``Original``Data``Servlet) to have same options and same output, web page simply forms the URL. An email
{noformat}
Hi Kevin, 
I'm noticing that the GetOriginalDataServlet app seems to be adding an additional CR/LF between the 
ISUS samples (each sample has four data records) when I snarf it directly as opposed to displaying 
it via a browser. See the URL below to see what I'm describing. It won't be a problem as far as 
I'm concerned just something I noticed. 

http://www2.mbari.org/coletti/m0_isus.cgi

Luke

And another

Ah Ha, 
look what happens when you set noHTMLHeader=0 (URL below)... 
http://ssds.shore.mbari.org:8080/access/GetOriginalDataServlet?platformID=1299&metadataID=0
&recordTypeID=1&isi=0&noHTMLHeader=0&deviceID=1268&startDateTime=20040603.223400&endDateTime=20040606.223400, 
Luke
{noformat}
# Implmement basic metadata/data QC internal to SSDS (watchdog)
# Refactor Ruminate in new architecture
# When information in XML is inconsistent (device ID) with that of packet, somebody should be notified.
# If device comes in with new ID, it will be updated/persisted, should not'
# Performance investigation of services (sort of ongoing process)
# The XML``Metadata``Tracker does not look like it is working properly (especially on AUV files) in the ruminate process
# Andrew metioned that the depths (Data``Container) are rounding.
# Boolean not setting on incoming Metadata``Access``Servlet query (verify this is fixed in new architecture, then move to completed)
# Connect up raw stream access to the SQL database stream storage
# Add parameter that the user can ask for the last X number of records.
# Can we setup the Record``Description so that it can define a regular expression that can parse the whole record into variables?
# Can we have a service that will automatically take NEMA strings from GPS's and convert them to a more useful format?
# Implement Time``Indexed``Net``CDF``Access class
# Crawl all data stream files and republish data to SQL topic to populate DB with device stream data.
# Get NetCDF Watchdog going to keep NetCDF files created for those Data``Containers that ask for them.
# Get XML Defined for the Nortek binary case (variable binary length)
# Data servlet variables out of order and no flag for units
# Fix Bob's Code so it queries by deployment name, not device name then change 1305 and 1414 device names back to OASIS Bouy.Then go back and clean up device list per Paul C.  (Remove some of the M1/M2 designations). Remove devices 1307 and 1308 from database.
# Re-run all loads for AUVCTD data onto the production machine to make sure it is all there(?)
# When SSDSPUB tries to read from dods.mbari.org, it times out.

h3. Future Tasks (Shelved)
# Give Nancy Barr a base URL and she can have one of her crawlers check the links
# Look at porting code to J2SE 5 (Generics, Iterators).
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Develop method for handling app deployment on heckel/jeckel
# Can we use Bob Herlien to do some development work?
# Get Mike M and Dave from (CenCOOS) and talk through SSDS for CenCOOS and getting them AUV data from MBARI.
# Apply AJAX to web pages where performance problems exist ([http://code.jalenack.com/periodic/ Example])
# Fix Metadata links on CIMT pages to make them dynamic (or replace with different view, not XML)
# Pull the MBARI ADCP page off the CIMT site
# Look at [http://www.sensescape.com/scivis/index.html Visualization in Marine Science]
# Look into [http://www.openmi.org OpenMI]
# Turn on wrapper generator unit tests in continuous integration and process/display results
# Refactor/overhaul CIMT chart creation application to allow users to configure their own offline chart creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
# Get UI Design meetings going with the ops group and get portal prototype going
# Ken Heller came by to ask to turn on more batch created plots for CIMT
# Put link to ACE jar in web application
# Ken also had another request to be able to see all variables plotted as thumbnails on one page, be able to select various plots and then have them show as full size together on another page (a merging of sorts for data).
# Add pages for metadata editing (MetadataEditingNote)
# SIAM``Raw``Data``Access Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement Query: Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location).  This is specifically to support uploading the JARS for SIAM and linking them to Devices and Data``Producers(Deployments).
# Implement Query: They would like to be able to store the driver class name that is linked to a Device so that they can have the user simply choose a device and it will start with that driver name.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into having SSDS create "README" type files in the same location as certain Data``Containers (This could be a perl script bot)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179756</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212537</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179770</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212536</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.

h3. Graphing Application
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179769</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212533</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Verify that wrapper generator unit test are on during test target of build.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.

h3. Graphing Application
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Instead of using comand line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.

h3. Clients
# Migrate HOOVES to new architecture
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Future Tasks (Shelved)
# Hold Brown Bag on architecture and uses.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional Standard``Variables, Standard``Units, Standard``Keywords, Standard``Domain, Standard``Reference``Scale, Device``Type, Resource``Type, Data``Producer``Group, Data``Container``Group and then notify the user of that change so they can change their source.
# Remove Deployment info from PUCK XML (someday, probably for MSE).
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.
# Write tests for Resource``BLOB->Object``Builder for byte array and verify that it is working correctly.
# Send API's for SSDS ingest and Data``Stream Access to Data``Stream LOOKING group
# Look at Mike Godin's Schema changes for AOSN
# Can I embed the business logic documentation as Java``Doc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# See if I can use NT logins with Merlia driver in SSDS
# Have the capability to turn off emails when resubmit is done.
# Implmement generic way of sending data/XML
## Create application that reads in NetCDF file and generates XML to match our schema
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Cut down on JAR file bloat (happening in new arch)
# Crawl all the old OASIS files and load the metadata into SSDS.
# Meet with MMI to talk about pulling our SV and SU from ontologies.
# XML with schemas declared not validating
# Add mechanism that users can drop files of known type with all metadata in known format into a directory and SSDS will automatically register and store it.
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# Implement ingest socket -> JMS topic
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In Packet``Output``Manager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179766</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212534</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.

h3. Graphing Application
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup

h3. Clients
# Migrate HOOVES to new architecture
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Future Tasks (Shelved)
# Add QC flag to SSDS packets and match in database (SSDS_Data).
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and Packet``Outputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add end of line terminator as separator in parsing packet records (not files)
# Can I create something that will emulate reading from a serial port but is back by the SSDS data service? This would be done so that native applications that are used to reading from serial ports, can still do so.  To be honest, this would be really cool, but seems fragile and unlikely.  This started with the Nortek, so look at Nortek.no for what they called "Online applications"
# Get LOBO data into SSDS
# Get raw data porting from SSDS to LAS server working for Mooring data (Leverage Mike G's stuff).
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" data by storing comments with the data and returning that to user's upon request (think NetCDFs history)
# Edit bad packets that are serialized to disk
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data)
# Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Setup service that will calculate salinity automatically.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Query: "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Create Process to create useable data file from inductive CTD string
# Look at integrating Earth Google using services.
# HOOVES Improvements:
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
# Look at NPS AUV Mission Planner as a way to interact with AUV data.Don Brutzman and Peter Flynn came to give a demo on this and it seems to be a possibility for a tool that can integrate and visualize modeling and collected data (as well as vehicle tracks).  Just check Don's web address to find information
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179767</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959216</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server and it will bind to 0.0.0.0 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless=true -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}
# I was promptly hacked again by leaving the jmx-console and the web-console in place.  I removed those by shutting down jboss, removing jmx-console.war and the management directory from the the deploy directory, deleting the tmp and work directories and restarting.
# As an added security measure, we made root owner of all the files in the jboss directory structure except for the directories listed below which were owned by the process that runs JBoss (ApacheSSDSRO):
## JBOSS_HOME/server/default/data
## JBOSS_HOME/server/default/tmp
## JBOSS_HOME/server/default/work
## JBOSS_HOME/server/default/log
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926449</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959214</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server and it will bind to 0.0.0.0 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless=true -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}
# I was promptly hacked again by leaving the jmx-console and the web-console in place.  I removed those by shutting down jboss, removing jmx-console.war and the management directory from the the deploy directory, deleting the tmp and work directories and restarting.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926447</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388142</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355411</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388146</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
*content.directory.location=/Users/kgomes/Sites/ssdsdata*
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
*jboss.home=/Applications/jboss-4.2.2.GA*
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
*sudo ./bin/run.sh*
A whole bunch of stuff should go by and eventually you should see something like:
*16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms*
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355415</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388144</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
*content.directory.location=/Users/kgomes/Sites/ssdsdata*
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355413</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697242</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664491</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388131</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355400</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697240</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664489</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388137</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355406</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388157</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355426</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388162</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355431</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388160</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355429</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388150</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355419</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388148</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
*sudo ./bin/run.sh*
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355417</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388147</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
*content.directory.location=/Users/kgomes/Sites/ssdsdata*
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
*jboss.home=/Applications/jboss-4.2.2.GA*
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
*sudo ./bin/run.sh*
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355416</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388154</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355423</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388152</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution (4.2.2GA)
# Unzip to an installation location
# For Flex development, download and install the Adobe Flex SDK
# Copy custom.properties.template to custom.properties and edit
# Define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml{code}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{code}
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355421</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959348</id>
<property name="body"><![CDATA[This body of work was to try and identify what SSDS changes need to be made to implement some sort of security and policy enforcement for the SSDS.  The first thing to do was to try and gather information about what people were looking for in access restrictions and such for their data.

h5. Kanna Rajan
I talked to Kanna about data access for CANON and his feeling was that it should not be open to the entire world, but within a group of collaborations, everyone should have access to the data that is part of the collaboration.  Sort of the once you're in, you're in idea.

h5. Francisco Chavez
# Francisco mentioned that a sort of standard data policy for academics is that raw data is embargoed for 2 years, after which the PI makes it available to the public.
# Ideally, there would be some way to automatically track all citations of data that people use for publications.
# He felt that there would probably be some limited number of options that data providers could choose from and apply to their data.  For example:
## Option 1: Data available to all
## Option 2: X Number of days embargo which nobody but the PI has access to the data after which it will be made public
## Option 3: X Number of days embargo which the public does not have access to the data, but a select group of collaborators might (defined by the PI).  After the X number of days, that data would be available to the public.
## Option 4: Different groups of users have different dates of embargo.  Group A has immediate access, Group B has 1 year embargo, public has 2 year embargo for example.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926586</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959350</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server and it will bind to 0.0.0.0 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless=true -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}
# I was promptly hacked again by leaving the jmx-console and the web-console in place.  I removed those by shutting down jboss, removing jmx-console.war and the management directory from the the deploy directory, deleting the tmp and work directories and restarting.
# As an added security measure, we made root owner of all the files in the jboss directory structure except for the directories listed below which were owned by the process that runs JBoss (ApacheSSDSRO):
## JBOSS_HOME/server/default/data
## JBOSS_HOME/server/default/tmp
## JBOSS_HOME/server/default/work
## JBOSS_HOME/server/default/log
# I then removed the http-invoker.sar from the deploy directory to remove the HTTP invoker for JNDI, EJB and JMX.
# I then removed the jms/jbossmq-httpil.sar from the deploy directory to remove the HTTP Invoker for JMS.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926588</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212674</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
## Create some template startup scripts and document
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.

## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets

## Follow up on PUCK configuration tool (ACE)

# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179909</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959343</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
# [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926581</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212673</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
## Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow administrators to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
## Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
## Build application to allow users to add QC flags and comments to data packets in SSDS_Data
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
## Follow up on PUCK configuration tool (ACE)
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
## Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
## Add mechanism to notify users of new data arrival (method TBD)
### Look into NRSS (RSS for data streams)
## In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
## Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179908</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212672</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
## Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow administrators to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
## Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
## Build application to allow users to add QC flags and comments to data packets in SSDS_Data
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Improve Data Ingest Mechanisms
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
## Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
## Add mechanism to notify users of new data arrival (method TBD)
### Look into NRSS (RSS for data streams)
## In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
## Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.


# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179907</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212671</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
## Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow administrators to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
## Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
## Build application to allow users to add QC flags and comments to data packets in SSDS_Data
## Verify PC02 plots are working after M0 turnaround
# Improve Data Ingest Mechanisms
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
## Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
## Add mechanism to notify users of new data arrival (method TBD)
### Look into NRSS (RSS for data streams)
## In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
## Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.

h3. Web applications
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179906</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697260</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664509</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212670</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow administrators to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Improve Data Ingest Mechanisms
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
## Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
## Add mechanism to notify users of new data arrival (method TBD)
### Look into NRSS (RSS for data streams)
## In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179905</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">18284547</id>
<property name="body"><![CDATA[In July of 2011, the database server that SSDS was running against was a an older version of SQL Server (2000) and SSDS was filling up the disk on Solstice.  For this reason, it was decided to create a whole new server in the DMZ running SQL 2008 and to move the SSDS databases to that machine.  Here are the steps taken during that work:

# 7:41 AM: SSH'd into pismo as kgomes
# 7:44 AM: edited the crontab using 'crontab -e' and commented out the entries that ran the data checker and the graphing routines.
# 7:45 AM: Verified the updatebot was runnning using 'ps -ef'
{noformat}
root      4203     1  0 Jul07 ?        00:00:15 /usr/java/jdk1.6.0_06/bin/java -Duser.timezone=UTC -Xms512m -Xmx1024m -classpath /opt/ssds/updatebot/ssds-updatebot-client-new-ssds.jar moos.ssds.clients.updateBot.UpdateBotRunner
{noformat}
# 7:45 AM: stopped the updatebot service using 'sudo /sbin/service updatebot stop'
# 7:49 AM: ssh'd into new-ssds.mbari.org as kgomes
# 7:50 AM: in another windows, ssh'd into bob.shore.mbari.org as kgomes
# 7:50 AM: verified JBoss was running on bob, using 'ps -aux' and getting:
{noformat}
root   11926   0.4 -4.8  1325572 100336  ??  S    27Jun11 1313:48.61 /usr/bin/java -server -Xmx1024M -Djboss.server.temp.dir=/var/tmp/jbosstmpdata11922 -classpath /Library/JBoss/3.2/bin/run.jar org.jboss.Main -c deploy-standalone
{noformat}
# 7:50 AM: on bob.shore.mbari.org, shut off the JBoss instance using:
{noformat}
sudo serveradmin stop appserver
{noformat}
# 7:54 AM: could not shutdown JBoss on new-ssds.mbari.org using 'sudo /sbin/service jboss stop' and figured out that I had to use:
{noformat}
cd /opt/jboss/bin
./shutdown.sh -S -s 134.89.2.25
{noformat}
# 8:16 AM: bob.shore.mbari.org had some oddities with iagadmin account, so I rebooted bob remotely using
{noformat}
sudo shutdown -r now
{noformat}
and then stopped the jboss service again.
# I then copied all the pertinent files from bob.shore.mbari.org, new-ssds and pismo to my local machine so I could edit them locally.


]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">18251779</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212669</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow users to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range
## Refactor and reinstate the SQL integrity checks Rich wrote.

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179904</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212668</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
# Enhance Access Interfaces
## Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
## Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
## Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
## Develop web page to allow users to configure plot creation
## Make any direction plot (wind, heading, etc.) plot as points, not lines
## Put nominal lattitude and longitude in plot titles
## Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179903</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212667</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179902</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212666</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.


h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179901</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212665</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.

h3. Predator (ssds.shore.mbari.org)

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179900</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212664</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
# Internal application Consolidation
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.


h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179899</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212663</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate

# Internal application Consolidation
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)

# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.


h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179898</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697252</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -b 0.0.0.0"}
{noformat}
so it will run the default server and it will bind to 0.0.0.0 (this needed to be done because requests to the naming service would return and IP of 127.0.0.1 which would cause clients to barf).  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I edited /opt/jboss/bin/run.conf and changed:
{noformat}
JAVA_OPTS="-server -Xms128m -Xmx128m"
{noformat}
to:
{noformat}
JAVA_OPTS="-server -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not looking for a graphics server and that the timezone to use it UTC and the memory it will use it reasonable.
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)
# Then I restarted JBoss
# I.S. had to open some firewall ports for me
# I then added the jboss script to start up for levels 3 and 5 just like for apache by using:
{noformat}
# chkconfig --add jboss
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664501</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212662</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
# Provide search tools
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179897</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959389</id>
<property name="body"><![CDATA[This body of work was to try and identify what SSDS changes need to be made to implement some sort of security and policy enforcement for the SSDS.  The first thing to do was to try and gather information about what people were looking for in access restrictions and such for their data.

h5. Kanna Rajan
I talked to Kanna about data access for CANON and his feeling was that it should not be open to the entire world, but within a group of collaborations, everyone should have access to the data that is part of the collaboration.  Sort of the once you're in, you're in idea.

h5. Francisco Chavez
# Francisco mentioned that a sort of standard data policy for academics is that raw data is embargoed for 2 years, after which the PI makes it available to the public.
# Ideally, there would be some way to automatically track all citations of data that people use for publications.
# He felt that there would probably be some limited number of options that data providers could choose from and apply to their data.  For example:
## Option 1: Data available to all
## Option 2: X Number of days embargo which nobody but the PI has access to the data after which it will be made public
## Option 3: X Number of days embargo which the public does not have access to the data, but a select group of collaborators might (defined by the PI).  After the X number of days, that data would be available to the public.
## Option 4: Different groups of users have different dates of embargo.  Group A has immediate access, Group B has 1 year embargo, public has 2 year embargo for example.
# He mentioned that maybe we should look at the policies used by the Climate Data Center
# He felt there should be some standard acknowledgement clause that tells people they need to cite the sponsors of the data they are utilizing.
# He felt there should be some granularity within CANON to control access to various data sources (this goes against what Kanna was saying).
# We should be able to remove people from the group of collaborations and thus remove access to the data.

h5. MDUC
# Core CTD (Caress)
# Core Navigation (Caress)
# Core Mooring (McCann/Francisco)

h5. MOOS/MUCE (Paul/Ussler/Barry)

h5. Benthic Rover (Smith)

h5. ESP (Scholin)

h5. Benthic Imaging AUV (Jim Barry/Ken Smith)

h5. Ship/ROV Data (Grech/Etch)

h5. Video (Nancy J.)

h5. MARS (Craig D.)

h5. MOBB (Paul McGill)

h5. Power Buoy (Hamilton)

h5. FOCE (Peltzer/Brewer)

h5. Mapping AUV (Caress)

h5. Alex Worden

h5. Steve Haddock

h5. John Ryan

h5. ISUS (Ken Johnson)

h5. AOSN (Godin)

h5. LRAUV (Bellingham/Godin)

h5. Jim Barry

h5. ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926627</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697185</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664434</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212560</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179793</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212562</id>
<property name="body"><![CDATA[This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:

# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179795</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212550</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179783</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212551</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179784</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212552</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
h5. ORION CI
h5. CGSN

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179785</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212553</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. General
# Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
# Setup javadoc deployment as part of build task
# Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
# Put Copyright in all SSDS source code and zip up and make externally available.
# Verify that wrapper generator unit test are on during test target of build.
# Remove Deployment info from PUCK XML and move all to new schema and validate.

h3. SSDSPub
# Remove Microsoft SQL Server.
# Remove data directories.
# Clean everything up and look at making just a Tomcat installation to house web applications.
# Could we move applications to another machine with Tomcat and CNAME ssdspub to that machine?
# Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)

h3. Predator (ssds.shore.mbari.org)
# Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
# Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
# Shutdown web server on predator (dods too).
# Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
# Shutdown jboss on predator.
# Plan shutdown time for predator.
# Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
# Have Pat upgrade predator to RHE.
# Reinstall updateBot and graphing software and restart.

h3. Solstice
# Remove the SSDS database (backup first)

h3. Fog
# Remove the SSDS database (backup first)
# Backup and remove all DTS's except for Solstice-SSDS_Metadata->Fog-SSDS_Metadata

h3. UpdateBot
# Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
# Have updateBot crawl all resources and update contentLength if not specified.
# Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
# Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
# Look into having SSDS create "README" type files in the same location as certain DataContainers.
## These could/should be in FGDC format(?)

h3. Graphing Application (There is overlap with Mike's Post processing, we need to define logical boundaries)
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Develop web page to allow users to configure plot creation
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range

h3. Transmogrify/Ingest/SQLIngest
# Build non-JMS mechanism for users to send data/metadata to SSDS.
# Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
# Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)

h3. Core (EAR)
# Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
# Build services to read data from DataContainers that are files through the query interface (not just from packets).
# Verify (unit tests) that the RecordDescription level parse regular expression works
# Finish implementing all DAOs
# Make sure all methods have associated count method
# Make sure all methods have boolean option for return full graph
# Make sure all methods have capability to specify a sort by field
# Verify returned DataContainer collections should be sorted by start date as default
# Verify implemented query for DataContainer by DataContainerGroup
# Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
# Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
# Write valid unit test for Object and XMLBuilders
# Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
# Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Look into implementing paging in services (Hibernate supports this).
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Migrate Rich's SQL DB checks and automate
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)

h3. Web applications
# Verify PC02 plots are working after M0 turnaround
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
# Increase session timeout in Explorer
# Add capability in Explorer to export deployment XML template from Web to help in XML authoring (or at least connect to most recent XML in CVS).
## Put link on device page to get to most recent XML (link to CVS).  Could this be generated from most recent deployment?
# Put UML diagram of data model on developer section of web app.
# Implement more queries in Explorer
## Find all post products from deployment
## Find all resources of certain types (graphics, log files, calibration files, etc.)
## "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
## Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent Data`roducer of type Deployment?
## Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
## "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Build web pages that allow user to send messages to different topics in the ingest component
# Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
# Finish documenting data packet structure on web pages.
# Web pages to help with automated workflows(?)
# Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# In Explorer, truncate long deployment names

h3. Clients
# Migrate HOOVES to new architecture and add improvements
## Full edit pages for deployment information
## Tree structure for dataset variables that are functions of depth
## SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
## Faster variable list generation by using DODS rather than netCDF API
## More consistent use of resourceType contentType info (MIME types)
## Top-level data set display for platform level deployment nodes
## Additional queries:
### by standard variable name
### by lat/lon rubber band box via mini maplet gui interface
## Fix Bugs:
### Window sizing on startup
### thread/hash problem with multiple plots
### Numerics not showing for some data sets
# GoogleMaps/GoogleEarth/Worldwind integration
# Follow up on PUCK configuration tool (ACE)
# Try to change OASIS to make mooring turns less painful
# Load historical OASIS data into SSDS (data and metadata).

h3. Other Project Overlaps
h5. SNMP
# SSDS to track data provenance (hooks into the ESB for capturing metadata?)
h5. ORION CI
h5. CGSN

h3. Community Interest
# Dalhousie
# SOPAC

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179786</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212571</id>
<property name="body"><![CDATA[h2. Abstract

Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As envisioned during its development the SSDS is now being used to help manage all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS is being used for full dataset progeny tracking. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient software. Examples of this can be seen in the Mooring netCDF plot pages where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. An approximate measure of efficiency is that one programmer can now do the work of what used to take 3 or 4.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]\\

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179804</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212576</id>
<property name="body"><![CDATA[h2. Abstract

Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As it was envisioned during its development, SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]
\\

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179809</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212575</id>
<property name="body"><![CDATA[h2. Abstract

Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As it was envisioned during its development, SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]
\\

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179808</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212578</id>
<property name="body"><![CDATA[h2. Abstract

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]


h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179811</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212577</id>
<property name="body"><![CDATA[h2. Abstract

Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As it was envisioned during its development, SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]
\\

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179810</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212568</id>
<property name="body"><![CDATA[This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:

# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179801</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212570</id>
<property name="body"><![CDATA[h2. Abstract

Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As envisioned during its development the SSDS is now being used to help manage all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS is being used for full dataset progeny tracking. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient software. Examples of this can be seen in the Mooring netCDF plot pages where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. An approximate measure of efficiency is that one programmer can now do the work of what used to take 3 or 4.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: http://oceana.shore.mbari.org:8081/display/SSDS/Tasks\\

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179803</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212569</id>
<property name="body"><![CDATA[Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core data streams. As envisioned during its development the SSDS is now being used to help manage all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, SSDS is being used for full dataset progeny tracking. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient software. Examples of this can be seen in the Mooring netCDF plot pages where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. An approximate measure of efficiency is that one programmer can now do the work of what used to take 3 or 4.

Project resources are being requested in 2008 to smooth out the rough edges of SSDS so that it can be supported in the long term for MBARI's data management needs. In particular, the work includes tasks that will:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Conduct maintenance on our existing and growing archive
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: http://oceana.shore.mbari.org:8081/display/SSDS/Tasks\\

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
# Timeliness: Why should this project move forward now? What are the drivers?
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
# The Team: Is the team appropriate for the work, are they available, and are they committed?
# Prior Productivity: Has the project leadership been successful with prior support?
# Does the project demonstrate improvements in operation from year to year?
# Does the effort have a significant impact on an important MBARI activity?
# Does the project team periodically assess the needs or requirements of its beneficiaries?
# Will the effort benefit a large number of users?

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179802</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212589</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirments Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179822</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697211</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664460</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212590</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirments Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)
# 

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179823</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212587</id>
<property name="body"><![CDATA[h3. Outline
#]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179820</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697213</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I had to install the mod_jk connector as it was not already installed.  I downloaded the binary .so file from the Apache connector project and installed in /usr/lib64/httpd/modules.  I also renamed it to just mod_jk.so
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see https://oceana.mbari.org/confluence/display/SPEPRJ/Apache+mod_jk)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664462</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212588</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline

# SSDS Requirments Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179821</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959423</id>
<property name="body"><![CDATA[This body of work was to try and identify what SSDS changes need to be made to implement some sort of security and policy enforcement for the SSDS.  The first thing to do was to try and gather information about what people were looking for in access restrictions and such for their data.

h5. Kanna Rajan (CANON)
I talked to Kanna about data access for CANON and his feeling was that it should not be open to the entire world, but within a group of collaborations, everyone should have access to the data that is part of the collaboration.  Sort of the once you're in, you're in idea.

h5. Francisco Chavez (CANON, BOG, Mooring)
# Francisco mentioned that a sort of standard data policy for academics is that raw data is embargoed for 2 years, after which the PI makes it available to the public.
# Ideally, there would be some way to automatically track all citations of data that people use for publications.
# He felt that there would probably be some limited number of options that data providers could choose from and apply to their data.  For example:
## Option 1: Data available to all
## Option 2: X Number of days embargo which nobody but the PI has access to the data after which it will be made public
## Option 3: X Number of days embargo which the public does not have access to the data, but a select group of collaborators might (defined by the PI).  After the X number of days, that data would be available to the public.
## Option 4: Different groups of users have different dates of embargo.  Group A has immediate access, Group B has 1 year embargo, public has 2 year embargo for example.
# He mentioned that maybe we should look at the policies used by the Climate Data Center
# He felt there should be some standard acknowledgement clause that tells people they need to cite the sponsors of the data they are utilizing.
# He felt there should be some granularity within CANON to control access to various data sources (this goes against what Kanna was saying).
# We should be able to remove people from the group of collaborations and thus remove access to the data.

h5. Dave Caress (MDUC CTD, MDUC Navigation, Mapping AUV)

h5. Jim Barry (MUCE, BI AUV)

h5. Charlie Paul (MUCE)

h5. Bill Ussler (MUCE)

h5. Ken Smith (Benthic Rover, BI AUV)

h5. Chris Scholin (CANON, ESP)

h5. Chris Grech (Ship/ROV Data)

h5. Steve E. (Ship/ROV Data, MARS Engineering)

h5. Nancy Jacobsen (Video)

h5. Craig Dawe (MARS Engineering Data)

h5. Paul McGill (MOBB)

h5. Andy Hamilton (Power Buoy)

h5. Ed Peltzer (FOCE)

h5. Peter Brewer (FOCE)

h5. Mapping AUV (Caress)

h5. Alex Worden

h5. Steve Haddock

h5. John Ryan

h5. Ken Johnson (ISUS)

h5. Mike Godin (AOSN, LRAUV)

h5. Jim Bellingham (AOSN, LRAUV)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926661</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212593</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## Data provenance for AUVCTD, all mooring processing
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)

h3. My guess for questions (and some thoughts on answers)
## How is this related to the Data Aggregation proposal
### Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
## Why haven't we made more progress on science related user interfaces?
### 
## What is the status of the Asset Tracking work?
### Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
## How much time will be requested?
### Largely this will come out of the proposal writing, but 

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179826</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388171</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
# Once JBoss finishes startup, you should see the line:
{noformat}
17:12:41,607 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 19s:45ms
{noformat}
and hopefully you did not see any stack traces fly by during startup.  If all looks OK, you should be able to go the SSDS_Metadata database and see newly created tables that will be where SSDS will store is metadata.  You can also open a browser and go to [http://localhost:8080/ssds-docs/] to see a simple page with some links to SSDS documentation and various utilities and libraries.
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
In order to actually do some development on the SSDS code base, you can use an IDE like Eclipse to edit the code and use ant to deploy your changes to JBoss.  To setup an Eclipse project.
# Install eclipse that you download from [http://www.eclipse.org]
# Startup Eclipse and select File->New->Java Project.
# In the New Project Window, select 'Create project from existing source' and browse to where you checked out the SSDS source code.  Once you configure the project correctly, you should have the following project settings:
## There should be two source directories:
{noformat}
src/java
{noformat}
and
{noformat}
src/gen
{noformat}
(src/gen is created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose it for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355440</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212594</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## Data provenance for AUVCTD, all mooring processing
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier.
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
## How is this related to the Data Aggregation proposal
### Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
## Why haven't we made more progress on science related user interfaces?
### 
## What is the status of the Asset Tracking work?
### Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
## How much time will be requested?
### Largely this will come out of the proposal writing, but 
## Will this be the last year of the project? (or, when will SSDS be 'done'?)
### Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects.
## Has anyone else showed interest in SSDS?
### Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179827</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212591</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## Data provenance for 
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)
# 

# My guess for questions (and some thoughts on answers)
## How is this related to the Data Aggregation proposal
### Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
## Why haven't we made more progress on science related user interfaces?
### 
## What is the status of the Asset Tracking work?
### Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179824</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212592</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## Data provenance for 
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)

h3. My guess for questions (and some thoughts on answers)
## How is this related to the Data Aggregation proposal
### Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
## Why haven't we made more progress on science related user interfaces?
### 
## What is the status of the Asset Tracking work?
### Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179825</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697203</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664452</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388167</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
# Once JBoss finishes startup, you should see the line:
{noformat}
17:12:41,607 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 19s:45ms
{noformat}
and hopefully you did not see any stack traces fly by during startup.  If all looks OK, you should be able to go the SSDS_Metadata database and see newly created tables that will be where SSDS will store is metadata.  You can also open a browser and go to [http://localhost:8080/ssds-docs/] to see a simple page with some links to SSDS documentation and various utilities and libraries.
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355436</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697204</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664453</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388169</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
# Once JBoss finishes startup, you should see the line:
{noformat}
17:12:41,607 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 19s:45ms
{noformat}
and hopefully you did not see any stack traces fly by during startup.  If all looks OK, you should be able to go the SSDS_Metadata database and see newly created tables that will be where SSDS will store is metadata.  You can also open a browser and go to [http://localhost:8080/ssds-docs/] to see a simple page with some links to SSDS documentation and various utilities and libraries.
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
In order to actually do some development on the SSDS code base, you can use an IDE like Eclipse to edit the code and use ant to deploy your changes to JBoss.  To setup an Eclipse project.
# Install eclipse that you download from [http://www.eclipse.org]
# Startup Eclipse and select File->New->Java Project.
# In the New Project Window, select 'Create project from existing source' and browse to where you checked out the SSDS source code.  Once you configure the project correctly, you should have the following project settings:
## There should be two source directories:
{noformat}
src/java
{noformat}
and
{noformat}
src/gen
{noformat}
(src/gen is created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355438</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093832</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# Incorporate this class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061069</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697206</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664455</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212585</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179818</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093830</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond,
																	// Pres, U,
																	// V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# Incorporate this class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061067</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697208</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664457</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388164</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355433</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697209</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /bin/bash -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory and renamed to just "jboss"
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC -Xms1024m -Xmx2048m"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC and the memory it will use it reasonable.  I also added the following so that the various HOMES were explicit.
{noformat}
export JAVA_HOME="/opt/java"
export JBOSS_HOME="/opt/jboss"
{noformat}
# I started up JBoss using the /etc/init.d script and it seemed to start up fine.  I could see it from a browser on localhost, but not from another machine (maybe firewall issues?).
# I then built and deployed the SSDS application on new-ssds.mbari.org (this is a bit involved and not described here).
# I then configured mod_jk to server basic port 80 traffic to the SSDS application (see ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664458</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8093828</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
# {code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond,
																	// Pres, U,
																	// V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8061065</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697195</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664444</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697197</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664446</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697199</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I created two scripts in the /etc/init.d directory to start and stop jboss (one for normal operation and one for remote debug).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664448</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697201</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!
# Now in order to expose those directories as http shares so people can access them, I created symlinks to those directories in /var/www/html
# Once the backup of /data/ssds stuff was done, IS re-enabled the rsync (running on pismo) so that the files from /data/ssds are copied to /ssdsdata/ssds
# I downloaded jboss-4.0.3SP1 from jboss.org, unzipped and untarred the file on my desktop
# I moved the newly created jboss-4.0.3SP1 folder to /opt
# I changed ownership of that directory to ApacheSSDSRO and apache as group
# I copied the jboss_init_redhat.sh script from the bin directory in jboss to the /etc/init.d directory
# I then edited that script and changed:
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss"}
{noformat}
to
{noformat}
JBOSS_HOME=${JBOSS_HOME:-"/opt/jboss"}
{noformat}
and:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c all"}
{noformat}
to:
{noformat}
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh"}
{noformat}
so it will run the default server.  Also changed:
{noformat}
JBOSSUS=${JBOSSUS:-"jboss"}
{noformat}
to:
{noformat}
JBOSSUS=${JBOSSUS:-"ApacheSSDSRO"}
{noformat}
# I then edited /opt/jboss/bin/run.sh and changed:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME"
{noformat}
to:
{noformat}
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.awt.headless -Duser.timezone=UTC"
{noformat}
to makes sure it knows it is not running on a server and that the timezone to use it UTC]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664450</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212598</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## MOOS Data/metadata management for:
### M0 Mooring (CIMT)
### MTM1 Mooring (Closed)
### MTM2 Mooring (Closed)
### MTM3 Mooring (Closed)
### MSE Mooring (all four nodes)
### M0 Mooring processing/provenance tracked
### MSE Mooring processing/provenance tracked
# SSDS Beyond MOOS
## Data/Metadata management for:
### M1 Mooring
### M2 Mooring
### AUVCTD
### Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).
## AUVCTD metadata cataloged, raw data transformed, data provenance tracked
## OASIS Mooring data and metadata stored and cataloged, data provenance tracked
## Bruce Howe's Aloha Mooring (Puget Sound) data and metadata cataloged
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).  Most tools work on user's constructing data provenance and saving them, not dynamically tracked by system.
## Evidence of this is that SSDS is specified as a component for the ORION CyberInfrastructure.
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier (core data stream management easier 1 person can do work of 3-4 developers).
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
# How does this work support the strategic plan?
# How is this related to the Data Aggregation proposal?
## Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
# Why haven't we made more progress on science related user interfaces?
## The MOOS mooring provided capabilities not availThe number of scientific instruments on MSE were not large and when we attempted to extract data/metadata management requirments from the science users
# What is SSDS' role in the ORION CI work?
## It is largely going to be used for metadata capture and catalog for observatory and instrument information and life cycle.  It will capture and store observatory and instrument metadata   (and some data) and make available to the CyberInfrastructure and it's users.
# What is the status of the Asset Tracking work?
## Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
# How much time will be requested?
## Largely this will come out of the proposal writing, but 
# Will this be the last year of the project? (or, when will SSDS be 'done'?)
## Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects.
# Has anyone else showed interest in SSDS?
## Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179831</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212597</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## MOOS Data/metadata management for:
### M0 Mooring (CIMT)
### MTM1 Mooring (Closed)
### MTM2 Mooring (Closed)
### MTM3 Mooring (Closed)
### MSE Mooring (all four nodes)
### M0 Mooring processing/provenance tracked
### MSE Mooring processing/provenance tracked
# SSDS Beyond MOOS
## Data/Metadata management for:
### M1 Mooring
### M2 Mooring
### AUVCTD
### Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).
## AUVCTD metadata cataloged, raw data transformed, data provenance tracked
## OASIS Mooring data and metadata stored and cataloged, data provenance tracked
## Bruce Howe's Aloha Mooring (Puget Sound) data and metadata cataloged
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).  Most tools work on user's constructing data provenance and saving them, not dynamically tracked by system.
## Evidence of this is that SSDS is specified as a component for the ORION CyberInfrastructure.
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier (core data stream management easier 1 person can do work of 3-4 developers).
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
# How does this work support the strategic plan?
# How is this related to the Data Aggregation proposal?
## Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
# Why haven't we made more progress on science related user interfaces?
## The MOOS mooring provided capabilities not availThe number of scientific instruments on MSE were not large and when we attempted to extract data/metadata management requirments from the science users
# What is SSDS' role in the ORION CI work?
## It is largely going to be used for metadata capture and catalog for observatory and instrument information and life cycle.  It will capture and store observatory and instrument metadata   (and some data) and make available to the CyberInfrastructure and it's users.
# What is the status of the Asset Tracking work?
## Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
# How much time will be requested?
## Largely this will come out of the proposal writing, but 
# Will this be the last year of the project? (or, when will SSDS be 'done'?)
## Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects.
# Has anyone else showed interest in SSDS?
## Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179830</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212596</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## MOOS Data/metadata management for:
### M0 Mooring (CIMT)
### MSE Mooring (all four nodes)
# SSDS Beyond MOOS
## Data/Metadata management for:
### M1 Mooring
### M2 Mooring
### AUVCTD
### Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).
## AUVCTD metadata cataloged, raw data transformed, data provenance tracked
## OASIS Mooring data and metadata stored and cataloged, data provenance tracked
## Bruce Howe's Aloha Mooring (Puget Sound) data and metadata cataloged
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).  Most tools work on user's constructing data provenance and saving them, not dynamically tracked by system.
## Evidence of this is that SSDS is specified as a component for the ORION CyberInfrastructure.
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier (core data stream management easier 1 person can do work of 3-4 developers).
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
# How does this work support the strategic plan?
# How is this related to the Data Aggregation proposal?
## Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
# Why haven't we made more progress on science related user interfaces?
## The MOOS mooring provided capabilities not availThe number of scientific instruments on MSE were not large and when we attempted to extract data/metadata management requirments from the science users
# What is SSDS' role in the ORION CI work?
## It is largely going to be used for metadata capture and catalog for observatory and instrument information and life cycle.  It will capture and store observatory and instrument metadata   (and some data) and make available to the CyberInfrastructure and it's users.
# What is the status of the Asset Tracking work?
## Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
# How much time will be requested?
## Largely this will come out of the proposal writing, but 
# Will this be the last year of the project? (or, when will SSDS be 'done'?)
## Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects.
# Has anyone else showed interest in SSDS?
## Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179829</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212595</id>
<property name="body"><![CDATA[Taking the text from the [2008 Abstract], an outline for the presentation might look like:

h3. Outline
# SSDS Requirements Under MOOS
## Store data streams from MOOS instruments
## Store and manage instrument metadata (catalog) for MOOS
## Track instrument lifecycles
## Operational Health and status
## Query catalog for data discovery
## Make data available (generally) in raw, transformed and post processed formats
## Provide metadata/data added value
## Track data provenance
# SSDS Beyond MOOS
## AUVCTD metadata cataloged, raw data transformed
## OASIS Moorings
## Bruce Howe's Aloha Mooring (Puget Sound)
# Current SSDS status (meeting the requirements)
## Raw data available and keeps legacy programs in tact.
## All instrument metadata cataloged in SSDS
## Data/metadata management for:
### MO Mooring (CIMT)
### M1 Mooring
### M2 Mooring
### MSE Mooring (all four nodes)
### AUVCTD
### Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).
## Data processing provenance for AUVCTD, all mooring processing
# Uniqueness in the Community and external impact
## Large amount of effort goes into 
## Most "data applications" rely on some structured data and focus more on specific analysis of data
## With some form of observatory middleware (like SIAM), SSDS can track and present the operational aspects of the observatory (instrument lifecycles)
## Data provenance is something that is lacking severely.  Workflow tools exists, but rely on existing services and ties them together (SSDS provides those services and metadata to make workflow go).
# Future for SSDS
## SSDS has demonstrated value outside of MOOS 
## SSDS makes internal data management easier.
## Manage more of our internal data
## Track more data processing.
## Move more core data to SSDS.
# What are we hoping to do?
## improving metadata editing capabilities and client applications
## redeploying database integrity checking 
## providing more useful and concise query and operational views of data producing systems
## maintaining our existing and growing archive of data and metadata
## distributing SSDS as an open source project

h3. My guess for questions (and some thoughts on answers)
# How is this related to the Data Aggregation proposal
## Data Aggregation is focused on taking curated data products and attaching powerful interfaces on top of them.  Data Aggregation will not cover the operational aspects of ocean observatories.  They don't care about engineering of operational data.  SSDS should provide base data from which Data Aggregation will derive its tailored data sets to.
# Why haven't we made more progress on science related user interfaces?
## 
# What is the status of the Asset Tracking work?
## Close to being finished and will finish during the last half of 2007 (2007 was extremely front loaded with other projects).  Asset tracking helps support this follow on work.
# How much time will be requested?
## Largely this will come out of the proposal writing, but 
# Will this be the last year of the project? (or, when will SSDS be 'done'?)
## Not this year, but we see future development being to support direct user requests, not infrastructure.  Work on SSDS most likely would be line items in other projects to support domain specific aspects.
# Has anyone else showed interest in SSDS?
## Yes, Dalhousie is interested in it for observatory management and SOPAC was interested in the cataloging component for managing bathymetry.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179828</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697189</id>
<property name="body"><![CDATA[1. Pat installed RHEL 5
2. He created a local lroot account for me.
3. After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
4. I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664438</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697191</id>
<property name="body"><![CDATA[1. Pat installed RHEL 5
2. He created a local lroot account for me.
3. After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
4. I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664440</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212599</id>
<property name="body"><![CDATA[h2. Abstract

In the years to come, the oceanographic community faces a unique challenge related to ocean observatories.  Even with the many legacy observatory systems operating today and with OOI observatories on the horizon, there is a large gap in the community between operational instruments and finished data products.  Even if an instrument is part of an ocean observatory, there is no guarantee in today's mix of systems that the data will be available for processing and dissemination.  MBARI has developed technology to help fill that gap both within the walls of MBARI and in the external community.  Originally a component of the MOOS project, the Shore Side Data System has become an integral component of several MBARI core (and some non-MBARI) data streams and successfully bridges that gap between instrument and finished data products.

As it was envisioned during its development, the SSDS is now successful in managing all the metadata surrounding instruments, their deployments, and the data they produce. Furthermore, the SSDS tracks specific versions of software that produce data sets such that complete provenance of a data set can be provided. This type of system is unique within the oceanographic community and has served MBARI's operational data management needs well by allowing us to remove metadata assignments from data processing software resulting in more reusable and efficient code. Examples of this can be seen in the Mooring [netCDF plot pages|http://dods.mbari.org/data/ssdsdata/deployments/netCDF_Plots.html] where a single module of software is used to process data from diverse multiple instruments into a common format. Before SSDS this kind of processing was done by multiple groups and individuals resulting in often incompatible data sets. One approximate measure of efficiency gained is that one programmer can now do the work of what used to take 3 or 4 people.  It is currently responsible for managing the metadata and data for the following systems and their post processed data products:
# MO Mooring (CIMT)
# M1 Mooring
# M2 Mooring
# MSE Mooring (all four nodes)
# AUVCTD
# Bruce Howe's Aloha Mooring CTD and flourometer (ADCP will be soon).

In addition to its internal success at MBARI, the SSDS capabilities have been deemed desirable to the ORION OOI program and is, in fact, part of the OOI CyberInfrastructure proposal.  Also, if MBARI wins the CGSN proposal, it is envisioned that they will need a system to "bridge" their development with that of the CyberInfrastructure.  Because both the CI and the CGSN are being developed in parallel, it is likely that the CGSN will need some data management before the CI is available for that functionality.  The SSDS could provide a system that the CGSN team could develop against the help them get started on the highest risk elements of the CGSN-CI interface.

In order to continue to support our internal data needs at MBARI and provide the most value to the external community, we are proposing more work on SSDS to add functionality to existing components as well as developing new pieces to complete the SSDS package.  Project resources are being requested in 2008 for tasks that include:
* Improve metadata editing capabilities and client applications
* Provide database integrity checking tools
* Provide more useful and concise query and operational views of data producing systems
* Conduct maintenance on our existing and growing archive of data and metadata
* Allow SSDS to be distributed as an open source project

A detailed list of tasks is available on the project Wiki: [http://oceana.shore.mbari.org:8081/display/SSDS/Tasks]

h2. Criteria&nbsp;

This will be an infrastructure project.  The criteria for infrastructure project evaluation is the following:
# Importance: Does the project address an important problem in oceanographic research?
## There is a gap between ocean instrumentation and data management systems and applications
## SSDS (with SIAM) has been filling that gap
## Automatic capture of all metadata
## Capturing data provenance
# Uniqueness: How unique is this contribution and well-suited for undertaking at MBARI?
## Not really an undertaking, but it operational at MBARI
## Due to its uniqueness it is being considered as a component in the ORION CI IO and external interests (Dalhousie, SOPAC)
# Timeliness: Why should this project move forward now? What are the drivers?
## This is the year to break SSDS out of MOOS and have it stand on its own legs.
## It is clearly an operational component, while the future of other MOOS technology is not clear
## This is the year to include non-MOOS inputs/outputs to make it a easier to use institutional asset
# Strategic Plan: Does the project demonstrate relevance to MBARI's strategic plan?
## Yes, particularly transfer of knowledge to external community.
## Particularly well position to help with OOI (both CI and CGSN if we win)
## Facilitates the response to opportunities to pass on data and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales
# The Team: Is the team appropriate for the work, are they available, and are they committed?
## Team would consist mainly of Kevin Gomes and Mike McCann (with support from others as more data streams are integrated)
# Prior Productivity: Has the project leadership been successful with prior support?
## SSDS has been successful to date and is the reason we are seeking to push SSDS outside of the MOOS envelope
# Does the project demonstrate improvements in operation from year to year?
## Yes, this past year has seen large improvements in robustness and support for MSE development team.  Many processes are moving to depend on SSDS (Mike's processing, Fred's OASIS - M0, M1, M2, NDBC Export, UW/Aloha mooring, WHOI used for MTM3 cable)
# Does the effort have a significant impact on an important MBARI activity?
## Yes, currently supporting M0/CIMT, M1, M2, AUVCTD, UW, MARS/SENSORS Prototype, Could impact CGSN award and serve as bridge between CGSN development and CI development.
# Does the project team periodically assess the needs or requirements of its beneficiaries?
## Definitely, we are constantly fielding requests from Engineering, Operations, Science, and the external community, but we are limited to respond by resources. 
# Will the effort benefit a large number of users?
## Operations: Better instrument management and operations status monitoring
## Science: More/Better interfaces to find and utilize data and associated processing and resources
## Support Engineering: Cut time to manage mooring data streams and data availability to outside community
## External community: get SSDS code base out there (this also cuts our time to fields requests from the community).

Salient points from the Strategic Plan:
# Our capacity for understanding the complexity of the ocean, and for forecasting a realistic view of its future that we will partially create, is limited by the lack of technology for observing the ocean and maintaining a sustained presence in that harsh environment.
# Goal: Transform and advance understanding of the most significant unsolved problems in oceanography by developing, adapting, and demonstrating innovative technologies.
# Goal: Utilize those developments to discover and understand how the natural system operates, responds to, and interacts with anthropogenic influences.
# Goal: Transfer the knowledge gained and the technology developed to communities outside of MBARI, including policy makers, government laboratories, resource managers, and the public.
# MBARI technology is in demand for adoption by groups external to the institution, and that demand is met through external partnerships, licensing, copying, or other strategies as appropriate.
# Look at: Natural rhythms of the complex ocean systems (Box 4), such as quantifying and understanding variability in the ocean food web on the seasonal, El Niño, and North Pacific Decadal Oscillation (PDO) time scales (emphasize time-series here).
# Research Actions: Develop a data archive for Monterey Bay that can be easily accessed by users who are not data providers and which can be integrated seamlessly with related data sets from the larger oceanographic community.
# Strategy B1: Participate in national initiatives that are aligned closely with MBARI's strategic plan and technology developments (Box 9), such as the National Science Foundation's Ocean Observing Initiative and National Oceanic and Atmospheric Administration's Ocean Exploration Program.
# Strategy D2: Be alert for opportunities to pass on the data, models, and understanding gained in pursuit of MBARI's research plan to organizations overseeing the environmental health of Monterey Bay and other locales. (Box 11).]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179832</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13697193</id>
<property name="body"><![CDATA[# Pat installed RHEL 5
# He created a local lroot account for me.
# After talking to IS, in order to mount the Tornado shares properly (AUVCTD, AUVBI, and ssdsdata), we created a domain account named ApacheSSDSRO and I changed the password to something hard to crack.
# I went on to new-ssds and created a new user ApacheSSDSRO with the same UID as the domain account (1113) and added the group apache to its membership.
{noformat}
# adduser -u 1113 -G apache -b /home -s /sbin/nologin -p ********** -g apache ApacheSSDSRO
{noformat}
# I edited the /etc/httpd/conf/httpd.conf file and changed the "User" line from "apache" to "ApacheSSDSRO" which should run the httpd service as ApacheSSDSRO.  This was important so that it's UID will get passed to the network share when serving http requests.
# I ran the chkconfig command to make sure httpd started on reboot
{noformat}
# chkconfig --level 35 httpd on
{noformat}
# I then edited the /etc/fstab file to mount the tornado shares that SSDS needs:
{noformat}
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
# MBARI mounts
tornado.shore.mbari.org:/vol/vol0/ssdsdata /ssdsdata nfs ro 0 0
tornado.shore.mbari.org:/vol/vol0/AUVCTD /data/auvctd nfs ro 0 0
tornado.shore.mbari.org:/vol/AUVBI /data/auvbi nfs ro 0 0
{noformat}
# I created the directories /data/auvctd, /data/auvbi, /data/ssds/generated, /data/ssds/ruminate/xml, /ssdsdata and made ApacheSSDSRO as the owner and apache as the group for these. (including the parent /data directory).
# I put in a request to IS to have them restore the /data/ssds/ruminate/xml directory
# I downloaded jdk1.6.0_20 from Sun (Oracle's) web site to the Desktop on /root and then ran the .bin executable.  It created a directory jdk1.6.0_20 which I then moved to /opt
# I created a symbolic link in /opt to /opt/java which pointed to that folder.
# I then created symbolic links to all the stuff in /opt/java/bin to links in the /usr/bin directory to put them all on the path
{noformat}
ln -sf /opt/java/bin/* /usr/bin
{noformat}
# I rebooted here just to make sure everything that I had done to date took:
## httpd service started automatically ... yeah!
## mounts were successful ... yeah!]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13664442</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195659</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

{jiraissues:url=http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&priority=1&priority=2&priority=3&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&tempMax=1000&os_username=kgomes&os_password=cAn0jAh01}

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162893</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13959445</id>
<property name="body"><![CDATA[This body of work was to try and identify what SSDS changes need to be made to implement some sort of security and policy enforcement for the SSDS.  The first thing to do was to try and gather information about what people were looking for in access restrictions and such for their data.

h3. Tasks

Container-based security
## Setup security domain to work with I.S.'s Centrify system
#

Contextual-based security

Attribution Infrastructure


h3. Interview Notes

h5. Kanna Rajan (CANON)
I talked to Kanna about data access for CANON and his feeling was that it should not be open to the entire world, but within a group of collaborations, everyone should have access to the data that is part of the collaboration.  Sort of the once you're in, you're in idea.

h5. Francisco Chavez (CANON, BOG, Mooring)
# Francisco mentioned that a sort of standard data policy for academics is that raw data is embargoed for 2 years, after which the PI makes it available to the public.
# Ideally, there would be some way to automatically track all citations of data that people use for publications.
# He felt that there would probably be some limited number of options that data providers could choose from and apply to their data.  For example:
## Option 1: Data available to all
## Option 2: X Number of days embargo which nobody but the PI has access to the data after which it will be made public
## Option 3: X Number of days embargo which the public does not have access to the data, but a select group of collaborators might (defined by the PI).  After the X number of days, that data would be available to the public.
## Option 4: Different groups of users have different dates of embargo.  Group A has immediate access, Group B has 1 year embargo, public has 2 year embargo for example.
# He mentioned that maybe we should look at the policies used by the Climate Data Center
# He felt there should be some standard acknowledgement clause that tells people they need to cite the sponsors of the data they are utilizing.
# He felt there should be some granularity within CANON to control access to various data sources (this goes against what Kanna was saying).
# We should be able to remove people from the group of collaborations and thus remove access to the data.

h5. Dave Caress (MDUC CTD, MDUC Navigation, Mapping AUV)

h5. Jim Barry (MUCE, BI AUV)

h5. Charlie Paul (MUCE)

h5. Bill Ussler (MUCE)

h5. Ken Smith (Benthic Rover, BI AUV)

h5. Chris Scholin (CANON, ESP)

h5. Chris Grech (Ship/ROV Data)

h5. Steve E. (Ship/ROV Data, MARS Engineering)

h5. Nancy Jacobsen (Video)

h5. Craig Dawe (MARS Engineering Data)

h5. Paul McGill (MOBB)

h5. Andy Hamilton (Power Buoy)

h5. Ed Peltzer (FOCE)

h5. Peter Brewer (FOCE)

h5. Mapping AUV (Caress)

h5. Alex Worden

h5. Steve Haddock

h5. John Ryan

h5. Ken Johnson (ISUS)

h5. Mike Godin (AOSN, LRAUV)

h5. Jim Bellingham (AOSN, LRAUV)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13926683</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212739</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179975</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195657</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162891</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195658</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

{jiraissues:url=http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&priority=1&priority=2&priority=3&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&tempMax=1000&os_username=jira-guest&os_password=anonymous}

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162892</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195655</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162889</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195656</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

h3. From JIRA

{jiraissues:url=http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&priority=1&priority=2&priority=3&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&tempMax=1000}

h3. Other
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162890</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">6782979</id>
<property name="body"><![CDATA[The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">6750211</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">6782981</id>
<property name="body"><![CDATA[{warning:title=This list no longer updated}
This task list is being kept for posterity sake and that it has some desired tasks that were shelved for a later date.  The task that are currently being worked on are managed in the project plan located [here|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html Project Plan]
{warning}
The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">6750213</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195693</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS, the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct, copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162927</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">6782982</id>
<property name="body"><![CDATA[h5. SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

h5. Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]

h5. Tasks
# [Tasks]

h5. Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

h5. Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|https://oceana.mbari.org/jira/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">6750214</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">6782986</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">6750218</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17498275</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine malino.soest.hawaii.edu.  There are a couple of accounts that I used on malino during the installation.  They are:
# kgomes
# jboss
I also used the 'root' account on the mysql installation for the work I was doing on the database.
{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.25 for me.
{note}
# I first ssh'd into the malino and then started up the mysql client using
{noformat}
mysql --user=root --password
{noformat}
# I then created the two needed databases using:
{noformat}
create database ssds_data;
create database ssds_metadata;
{noformat}
# I then created a user that will have all rights to the databases that SSDS will use to connect:
{noformat}
create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'
{noformat}
# I then granted all rights to the databases for the newly created user
{noformat}
GRANT ALL ON ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL ON ssds_metadata.* TO 'ssdsadmin'@'localhost';
{noformat}
# I then checked out the source code on my malino in the jboss home directory /export/malino/jboss/ssds/build/shore-side-data-system-read-only
# I downloaded the adobe flex sdk and unpacked it in /export/malino/jboss/flex_sdk
# I downloaded apache ant and unzipped it in /export/malino/jboss/ant
# I created a .login file in the jboss home directory and set two environment variables
{noformat}
setenv JAVA_HOME /export/malino1/jdk
setenv ANT_HOME /export/malino/jboss/ant
{noformat}
# I started up the JBoss on malino from the command line just to make sure it worked and all looked OK.
# I then copied the custom.properties.template file in the ssds source directory to a file called custom.properties and edited it to match all the configurations for the deployment on malino
# I then ran:
{noformat}
../../../ant/apache-ant-1.8.2/bin/ant deploy
{noformat}
from the /export/malino/jboss/ssds/build/shore-side-data-system-read-only directory and it deployed all the files to the JBoss installation.
# I then ran JBoss from the command line to make sure SSDS started up OK. (started up in 30s)
{note:title=Firewall issue}
I had to use the local firefox and point it to localhost to get to SSDS because of firewall issues (exported XTerm display)
{note}
# I used the ssds/newDeviceType.jsp page to create new device types for camera, CTD, ADP/currents, fluorometer, and inductive modem.
# I used the ssds/newPerson.jsp page to create a contact for Fernando
# I used the ssds/newDevice.jsp page to create all new device IDs for the ALOHA instruments and sent those IDs to the ALOHA team.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17465509</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212678</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(41 days - 11 KG, 10 MM, 20 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (20 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179913</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195601</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162835</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212677</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179912</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">2195602</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

Procedures
# [Instrument Swap on Oasis Mooring]
# [Mooring turn]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">2162836</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212676</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE, 10 days I.S.)
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
## Follow up on PUCK configuration tool (ACE)
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179911</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212675</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management
## Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## Setup javadoc deployment as part of build task
## Verify that wrapper generator unit test are on during test target of build.
## Remove Deployment info from PUCK XML and move all to new schema and validate
## Create some template startup scripts and document
# Internal application Consolidation
## Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## Shutdown web server on predator (dods too).
## Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## Shutdown jboss on predator.
## Plan shutdown time for predator.
## Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## Have Pat upgrade predator to RHE.
## Reinstall updateBot and graphing software and restart.
## Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## Remove Microsoft SQL Server on SSDSPub
## Remove data directories on SSDPub
## Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
## Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## Remove the SSDS database from Solstice (backup first)
## Remove the SSDS database from Fog (backup first)
## Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community
## Put Copyright in all SSDS source code and zip up and make externally available.
# Metadata Integrity Checking/Repairing/Enhancing
## Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## Have updateBot crawl all resources and update contentLength if not specified.
## Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without.
## Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
## Follow up on PUCK configuration tool (ACE)
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179910</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212682</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179917</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212681</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179916</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212680</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(41 days - 11 KG, 10 MM, 20 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (20 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## (2 days) Develop web page to allow administrators to configure plot creation
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179915</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212679</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(41 days - 11 KG, 10 MM, 20 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (20 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces
## Develop web page to allow administrators to configure plot creation
## Build services to read data from DataContainers that are files through the query interface (not just from packets).
## Finish implementing all DAOs
## Make sure all methods have associated count method
## Make sure all methods have boolean option for return full graph
## Make sure all methods have capability to specify a sort by field
## Verify returned DataContainer collections should be sorted by start date as default
## Verify implemented query for DataContainer by DataContainerGroup
## Look into implementing paging in services (Hibernate supports this).
## Verify PC02 plots are working after M0 turnaround
## Add links to CVS XML on device pages
## Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## In Explorer, truncate long deployment names
## Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## Migrate HOOVES to new architecture and add improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Load historical OASIS data into SSDS (data and metadata).
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179914</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212686</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(3 days - 3 KG)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179921</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212685</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(3 days - 3 KG)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179920</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212684</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(3 days)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation *(6 days)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179919</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212683</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do
# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms
## Try to change OASIS to make mooring turns less painful
## Build non-JMS mechanism for users to send data/metadata to SSDS.
## Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## Change PacketSQLOutput/Input to work with any database (not just MS SQL)
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files).
# Improve Testing
## Verify (unit tests) that the RecordDescription level parse regular expression works
## Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## Write valid unit test for Object and XMLBuilders
## Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
# Documentation
## Put UML diagram of data model on developer section of web app.
## Finish documenting data packet structure on web pages.

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179918</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212687</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract]
# [2008 Abstract Presentation]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179922</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212723</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation]
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179958</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212724</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PDF|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179959</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212725</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PDF|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179960</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212726</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179961</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9831144</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9798394</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212738</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179974</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17498270</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.24 for me.
{note}

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

# I then created a user that will have all rights to the databases that SSDS will use to connect:

create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'

# I then granted all rights to the databases for the newly created user

GRANT ALL ON ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL ON ssds_metadata.* TO 'ssdsadmin'@'localhost';

# I then checked out the source code on my local machine and also installed JBoss 5.1.0GA locally and Flex SDK so I could compile everything locally for a remote deployment.

# I started up the JBoss on kainani from the command line.  It takes 4 minutes to startup!!  That may be a problem, but we will see.
{note:title=workaround alert!}
When I first started JBoss, I got some cryptic error at the boot stage.  I Googled and found that I needed to edit the conf/bootstrap/profile.xml per the instructions here:
http://stackoverflow.com/questions/2489106/error-starting-jboss-server
{note}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17465504</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212709</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract]
# [2008 Abstract Presentation]
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179944</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17498273</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine malino.soest.hawaii.edu.  There are a couple of accounts that I used on malino during the installation.  They are:
# kgomes
# jboss
I also used the 'root' account on the mysql installation for the work I was doing on the database.
{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.25 for me.
{note}
# I first ssh'd into the malino and then started up the mysql client using
{noformat}
mysql --user=root --password
{noformat}
# I then created the two needed databases using:
{noformat}
create database ssds_data;
create database ssds_metadata;
{noformat}
# I then created a user that will have all rights to the databases that SSDS will use to connect:
{noformat}
create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'
{noformat}
# I then granted all rights to the databases for the newly created user
{noformat}
GRANT ALL ON ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL ON ssds_metadata.* TO 'ssdsadmin'@'localhost';
{noformat}
# I then checked out the source code on my malino in the jboss home directory /export/malino/jboss/ssds/build/shore-side-data-system-read-only
# I downloaded the adobe flex sdk and unpacked it in /export/malino/jboss/flex_sdk
# I downloaded apache ant and unzipped it in /export/malino/jboss/ant
# I created a .login file in the jboss home directory and set two environment variables
{noformat}
setenv JAVA_HOME /export/malino1/jdk
setenv ANT_HOME /export/malino/jboss/ant
{noformat}
# I started up the JBoss on malino from the command line just to make sure it worked and all looked OK.
# I then copied the custom.properties.template file in the ssds source directory to a file called custom.properties and edited it to match all the configurations for the deployment on malino
# I then ran:
{noformat}
../../../ant/apache-ant-1.8.2/bin/ant deploy
{noformat}
from the /export/malino/jboss/ssds/build/shore-side-data-system-read-only directory and it deployed all the files to the JBoss installation.
# I then ran JBoss from the command line to make sure SSDS started up OK. (started up in 30s)
{note:title=Firewall issue}
I had to use the local firefox and point it to localhost to get to SSDS because of firewall issues (exported XTerm display)
{note}
# I used the ssds/newDeviceType.jsp page to create new device types for camera, CTD, ADP/currents, fluorometer, and inductive modem.
# I used the ssds/newDevice.jsp page to create all new device IDs for the ALOHA instruments and sent those IDs to the ALOHA team.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17465507</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212712</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).

# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user's should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring\(m1|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring\(m1|m2)\YYYY\cfg directory.
# This next steps is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that show the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Save the cfg file.
{note:title=Saving the file will make the change take hold}
When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.
# After the new deployment shows up in SSDS, the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}
A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct, copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '!' button.  That will remove all the data from the old instrument.

That's it ... whew!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179947</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212711</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).

# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user's should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring\(m1|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring\(m1|m2)\YYYY\cfg directory.
# This next steps is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that show the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Save the cfg file.
{note:title=Saving the file will make the change take hold}
When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.
# After the new deployment shows up in SSDS, the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179946</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17498272</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine malino.soest.hawaii.edu.  There are a couple of accounts that I used on malino during the installation.  They are:
# kgomes
# jboss
I also used the 'root' account on the mysql installation for the work I was doing on the database.
{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.25 for me.
{note}
# I first ssh'd into the malino and then started up the mysql client using
{noformat}
mysql --user=root --password
{noformat}
# I then created the two needed databases using:
{noformat}
create database ssds_data;
create database ssds_metadata;
{noformat}
# I then created a user that will have all rights to the databases that SSDS will use to connect:
{noformat}
create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'
{noformat}
# I then granted all rights to the databases for the newly created user
{noformat}
GRANT ALL ON ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL ON ssds_metadata.* TO 'ssdsadmin'@'localhost';
{noformat}
# I then checked out the source code on my malino in the jboss home directory /export/malino/jboss/ssds/build/shore-side-data-system-read-only
# I downloaded the adobe flex sdk and unpacked it in /export/malino/jboss/flex_sdk
# I downloaded apache ant and unzipped it in /export/malino/jboss/ant
# I created a .login file in the jboss home directory and set two environment variables
{noformat}
setenv JAVA_HOME /export/malino1/jdk
setenv ANT_HOME /export/malino/jboss/ant
{noformat}
# I started up the JBoss on malino from the command line just to make sure it worked and all looked OK.
# I then copied the custom.properties.template file in the ssds source directory to a file called custom.properties and edited it to match all the configurations for the deployment on malino
# I then ran:
{noformat}
../../../ant/apache-ant-1.8.2/bin/ant deploy
{noformat}
from the /export/malino/jboss/ssds/build/shore-side-data-system-read-only directory and it deployed all the files to the JBoss installation.
# I then ran JBoss from the command line to make sure SSDS started up OK. (started up in 30s)
{note:title=Firewall issue}
I had to use the local firefox and point it to localhost to get to SSDS because of firewall issues (exported XTerm display)
{note}
# I used the ssds/newDevice.jsp page to create all new device IDs for the ALOHA instruments and sent those IDs to the ALOHA team.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17465506</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212716</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract]
# [2008 Abstract Presentation]
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179951</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212718</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation]
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179953</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17498265</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.24 for me.
{note}

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

# I then created a user that will have all rights to the databases that SSDS will use to connect:

create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'

# I then granted all rights to the databases for the newly created user

GRANT ALL TO ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL TO ssds_metadata.* TO 'ssdsadmin'@'localhost';

# I then checked out the source code on my local machine and also installed JBoss 5.1.0GA locally and Flex SDK so I could compile everything locally for a remote deployment.

# I started up the JBoss on kainani from the command line.  It takes 4 minutes to startup!!  That may be a problem, but we will see.
{note:title=workaround alert!}
When I first started JBoss, I got some cryptic error at the boot stage.  I Googled and found that I needed to edit the conf/bootstrap/profile.xml per the instructions here:
http://stackoverflow.com/questions/2489106/error-starting-jboss-server
{note}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17465499</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1212720</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/75573063-e008-11db-8e28-f19c97b8be28/SSDS%20Strategy.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation]
# [Work Breakdown Structure|^SSDS_Hardening_WBS-1.xls] (Excel Spreadsheet)

Procedures
# [Instrument Swap on Oasis Mooring]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1179955</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489257</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]
# [Tasks]

Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456490</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388412</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

The Rover data is stored in the project share for the Rover, under Project.Data.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Project.Documents.ReformattedData.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets now (not sure which ones are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also choose to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, or will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355684</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489258</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule
# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.omniplan.zip]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456491</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13172817</id>
<property name="body"><![CDATA[h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

h5. Ingest Component]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13140051</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489256</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456489</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489253</id>
<property name="body"><![CDATA[h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&tempMax=1000}

h3. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456486</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13172811</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA and unzipped it to the C:\bin\jboss-4.2.2GA directory
## I started up JBoss from the command line and noticed that port 8080 had been taken by the SQL services.  I shutdown all SQL services, started JBoss so it could claim those ports, then restarted the SQL components.
# I then installed SmartSVN so that I could get the code from the Google SVN server.
# I started up SmartSVN and added a repository for Google code:
## SVN Location: http://shore-side-data-system.googlecode.com/svn/trunk
## Read only username: shore-side-data-system-read-only
# I checked the code out read-only to a directory with the name of the server (amphisbaena.usc.edu).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13140045</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489254</id>
<property name="body"><![CDATA[h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&tempMax=1000&anonymous=true}

h3. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456487</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388415</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

The Rover data is stored in the project share for the Rover, under Project.Data.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Project.Documents.ReformattedData.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets now (not sure which ones are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also choose to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, or will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up.  (Note Oxygen's xsltproc does not correctly handle the XPath/XPointer, and so will not work.)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355687</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489251</id>
<property name="body"><![CDATA[h1. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456484</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489252</id>
<property name="body"><![CDATA[
h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;priority;key;summary;assignee;status}

h3. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456485</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388417</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied (manually?) to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some information is out of date.

The Rover data is stored in the project share for the Rover (900502.BenthicRover), under Rover.Deployment.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and I believe it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Rover.Documents/ReprocessedData/RoverData_2007-2008_NewFormat.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDS

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (when Rover is physically deployed off a ship, or spends a period of time doing a science or engineering project), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity. This provides an order and hierarchy for the data, and puts different kinds of data into different folders.

Each data file also has a standard format in the normalized scheme, making fields like timestamp the same for all Rover files.

The organization and renaming of files from the old format to the new format was performed manually, and only for those missions that appeared to have any data of interest that could be converted. The reformatting of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident yet.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets now (not sure which ones are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also choose to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, or will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up.  (Note Oxygen's xsltproc does not correctly handle the XPath/XPointer, and so will not work.)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355689</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13172807</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA and unzipped it to the C:\bin\jboss-4.2.2GA directory
## I started up JBoss from the command line and noticed that port 8080 had been taken by the SQL services.  I shutdown all SQL services, started JBoss so it could claim those ports, then restarted the SQL components.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13140041</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388404</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

notes to include from PM conversation:
* moving data to SSDS share
* location of XML describing file formats
* possibility of writing files to SSDS, rather than records

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

We designed a new data format (changing both organization of files, and content for the data files) and expect the next release of the Rover software to write data in this format.  Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format.  

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado.   None of the data from that deployment has been converted to the modern format yet.  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead.

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but have run into some difficulties.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets.  A decision will have to be made about which of these should be submitted to the SSDS. 

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy].  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

POST

direct submission?

store and index

h1. XML and XSLT Files

The location of XML files describing records

the location of XSLT files to reformat the data in the XML files]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355676</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489266</id>
<property name="body"><![CDATA[The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. Currently Open JIRA Tasks/Bugs
{jiraissues:http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&tempMax=1000}

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456500</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489263</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

And then a diagram of how they will look after the cleanup:

!After Cleanup Deployment.jpg|thumbnail!

And then the steps on how to make that transition:

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}

h3. new-ssds.mbari.org

# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456497</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13172809</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA and unzipped it to the C:\bin\jboss-4.2.2GA directory
## I started up JBoss from the command line and noticed that port 8080 had been taken by the SQL services.  I shutdown all SQL services, started JBoss so it could claim those ports, then restarted the SQL components.
# I then installed SmartSVN so that I could get the code from the Google SVN server.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13140043</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388406</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

notes to include from PM conversation:
* location of XML describing file formats

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

The Rover data is stored in the project share for the Rover, under Project.Data.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Project.Documents.ReformattedData.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but have run into some difficulties.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets.  A decision will have to be made about which of these should be submitted to the SSDS. 

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy].  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

POST

direct submission?

store and index

h1. XML and XSLT Files

The location of XML files describing records

the location of XSLT files to reformat the data in the XML files]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355678</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489261</id>
<property name="body"><![CDATA[The idea of this work was to cleanup the build process so that it was very manageable and had a great number of common sense defaults setup so that the property configurations were not difficult.  This would allow for easier installation as well as development.  When I was doing this work, I setup the build so that the user could more easily switch between MySQL and MSSQL.  So a large part of this work over-lapped with the work to get the system ready for opening to the community.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456495</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388408</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

notes to include from PM conversation:
* location of XML describing file formats

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

The Rover data is stored in the project share for the Rover, under Project.Data.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Project.Documents.ReformattedData.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets now (not sure which ones are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also choose to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

The location of XML files describing records

the location of XSLT files to reformat the data in the XML files]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355680</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388410</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

The Rover data is stored in the project share for the Rover, under Project.Data.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Project.Documents.ReformattedData.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead. 

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets now (not sure which ones are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also choose to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file (possibly generated on the fly) that could point to the appropriate XML files (using XPath and XPointer).  The first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver.

I'm not sure how much of those concepts are in the Rover mission code, or will be added later.  The XML files have been written and are checked in at svn:rover/trunk/scripts/xml.  

I made some progress with describing Rover configurations using XSLT transforms to convert the XML information into web pages.  Three fairly viable XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355682</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489260</id>
<property name="body"><![CDATA[h3. Bugs and assigned tasks
{jiraissues:http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&tempMax=1000}

h3. SSDS Project Tasks To Do

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Descoped
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456493</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489273</id>
<property name="body"><![CDATA[*M0 Text File Generation Scripts - Documentation* Created by Seth Bushinsky - May 30, 2008 *Purpose:*

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; These programs produce text files from available M0 data.&nbsp; Two types of text files are produced: one set of files for each M0 deployment which consists of one text file per instrument and two text files (one for surface data, one for profile data) that include selected data for all M0 deployments that can be read into Loboviz (http://www.mbari.org/lobo/loboviz.htm).&nbsp; All files can be read using ODV or any text reader.&nbsp;  *Deployment Instrument Files:*

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Location: \\Tornado\ssdsdata\deployments\m0\ \[YYYYMM\] \ascii_output

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example (\\Tornado\ssdsdata\\deployments\m0\200706\ascii_output) Files created by 'nc_loaddap_text.m' called with the appropriate deployment date by a crontab script on Elvis (see table at the end of this document). *For mooring turnaround*, go to new deployment folder (\\Tornado\ssdsdata\deployments\m0\ \[YYYYMM\] ) and create sub-directory titled "ascii_output".&nbsp; Then change deployment call in crontab script - "cron_m0_txt_process".&nbsp; This should find all '.nc' files being created by ssds and make text files from these. *Loboviz Text Files:* This program produces two text files: M0PROF.txt and M0SURF.txt (along with M0PROF.cfg and M0SURF.cfg).&nbsp; Once a day, these files are copied by Loboviz and ingested so that the data can be plotted online.&nbsp;  File location: \\Tornado\ssdsdata\deployments\m0\ascii_all_dep.&nbsp;  Generated by "nc_loaddap_odv_surf.m" and "nc_loaddap_odv_prof.m".&nbsp; These files read in the netcdf files generated by ssds, as well as nitrate data from&nbsp; \\Tornado\ssdsdata\isuscimt\data\M0.txt .&nbsp; The netcdf file names are hard-coded into the processing. This script is run once a day.&nbsp; It deletes the last 3 hours of data in the file (which are usually NaN's) and appends new data to the end of the files.&nbsp; It also generates the '.cfg' files that contain the number of lines of data in each file. *For mooring turnaround,* open _both_"nc_loaddap_odv_surf.m" and "nc_loaddap_odv_prof.m", go down to where the long list of netcdf files is under the heading "%% Load Variables" and add the new deployments' netcdf files to the list.&nbsp;  \**If there is a change to the mooring data or some other error, keep in mind that because these files are appended instead of re-written, the mistake will stay in the text files.&nbsp; If this happens, simply delete the files and new ones will be created.&nbsp; However, when this happens, open the text files the next day and look in the header for weird characters that sometimes get added next to the "micro" or "degree" symbols.&nbsp; These can trip up Loboviz and prevent data ingestion.&nbsp; \\  | *Program* | *Machine* | *Crontab Script* | *Scripts called (next table has script location)* | *'.m' file location* |
| Text file generation | Elvis (user: ssdsadmin,   pw: water4u) | /bin/sh   /ssdsdata/deployments/m0/ascii_all_dep/cron/cron_m0_txt_process | nc_loaddap_text.m | \\Tornado\ssdsdata\deployments\m0\ascii_all_dep\mfiles |
| Loboviz file generation | Elvis | /bin/sh   /ssdsdata/deployments/m0/ascii_all_dep/cron/cron_m0_loboviz | nc_loaddap_odv_surf.m,   nc_loaddap_odv_prof.m | \\Tornado\ssdsdata\deployments\m0\ascii_all_dep\mfiles | ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456509</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388396</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1.  Overview: Status of Benthic Rover Data Mgt Tasks


h1. Converting Rover Data Formats


h1. Submitting Rover Data to SSDS


h1. Submitting Rover Images to SSDS

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355668</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489272</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule
# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.omniplan.zip]

h5. Tasks
# [Tasks]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456508</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388398</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

We designed a new data format (changing both organization of files, and content for the data files) and expect the next release of the Rover software to write data in this format.  Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format.  

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado.   None of the data from that deployment has been converted to the modern format yet.  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead.

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but have run into some difficulties.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets.  A decision will have to be made about which of these should be submitted to the SSDS. 

h1. Submitting Rover Images to SSDS]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355670</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388400</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

We designed a new data format (changing both organization of files, and content for the data files) and expect the next release of the Rover software to write data in this format.  Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format.  

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado.   None of the data from that deployment has been converted to the modern format yet.  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead.

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but have run into some difficulties.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets.  A decision will have to be made about which of these should be submitted to the SSDS. 

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy].  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

POST

direct submission?

store and index]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355672</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388402</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

notes to include from PM conversation:
* moving data to SSDS share
* location of XML describing file formats
* possibility of writing files to SSDS, rather than records

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied manually to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some is out of date.

There are several pending tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

We designed a new data format (changing both organization of files, and content for the data files) and expect the next release of the Rover software to write data in this format.  Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format.  

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado.   None of the data from that deployment has been converted to the modern format yet.  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intended to do this, logging all data retroactively instead.

h3. Logging Rover images to SSDs

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (Rover is deployed for a day, or spends a period of time doing science), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity.

Each data file also has a standard format, making fields like timestamp the same for all Rover files.

The organization of files from the old format to the new format was done manually. The organization of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS deployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but have run into some difficulties.  All this work was continuing. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records,  (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs.

The data records were most important data elements, but additional data files appear to be in the data sets.  A decision will have to be made about which of these should be submitted to the SSDS. 

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is abysmal. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy].  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and the name as noted previously is weak (subject to being changed).

h3. Image storing technique

POST

direct submission?

store and index]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355674</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945032</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|Something SIAM used, but SSDS ignores|
|DevicePacketVersion|java.lang.long|In theory, this would be used to define format of packet, but essentially there is just one format so it should be 0|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912277</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945033</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.



h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|Something SIAM used, but SSDS ignores|
|DevicePacketVersion|java.lang.long|In theory, this would be used to define format of packet, but essentially there is just one format so it should be 0|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912278</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945036</id>
<property name="body"><![CDATA[In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  Here is a diagram that looks at the various pieces of TransmogrifyMDB.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912281</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945037</id>
<property name="body"><![CDATA[{gliffy:name=Transmogrify Details|space=SSDS|page=Testing TransmogrifyMDB|pageid=10912280|align=center|size=L}
In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  Here is a diagram that looks at the various pieces of TransmogrifyMDB.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912282</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945039</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Ingest Deployment]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912284</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945040</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Ingest Deployment]
** [Testing|SSDS:Testing TransmogrifyMDB]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912285</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945041</id>
<property name="body"><![CDATA[
In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  Here is a diagram that looks at the various pieces of TransmogrifyMDB.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912286</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945044</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912289</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489239</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Installation and Development]

h5. Developer

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]

Design Docs
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456471</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945043</id>
<property name="body"><![CDATA[
In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  Here is a diagram that looks at the various pieces of TransmogrifyMDB.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912288</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489242</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456474</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945046</id>
<property name="body"><![CDATA[h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912291</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489241</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456473</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945045</id>
<property name="body"><![CDATA[In order to test the TransmogrifyMDB class, it needs to be done in the context of a J2EE container.  You can see how the TransmogrifyMDB is deployed in a J2EE container on
[this page|Ingest Deployment]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912290</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489236</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]

h5. Developer

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]

Design Docs
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456468</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945048</id>
<property name="body"><![CDATA[h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912293</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489235</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]
# [Mooring Processing]

Procedures
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456467</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945050</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912295</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489237</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1. You probably want to start up JBoss just to make sure it runs before trying to build SSDS.  Open a command prompt and cd to the jboss installation directory.  Then type 'bin\run.bat' (Windows) or './bin/run.sh' (UNIX).  Once it has finished startup, you should be able to go to http://_myserver_:8080 and see the jboss console.
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below) or set an environment variable name SSDS_BUILD_NAME and that will automatically set the ant property "name".  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.
** *NOTE* In the _myserver_-build.properties (or default-build.properties if you edited those) you will need to set the 
# Setup a HTTP server on the server where SSDS will be deployed an mount the directory where the content.deployment.location pointed to.  This will make all SSDS generated content available through an HTTP server.  For example, if the content.deployment.location property was set to /data/ssds, then create a symbolic link to that directory under the htdocs in your apache and open it up for reading.
# Similarly, you will want to setup a DODS server to point to that directory as well.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456469</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489247</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]
# [Tasks]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana.shore.mbari.org:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]

[Test remote attachement|alfresco.mbari.org+Installation+Notes^AlfrescoLogo32.png]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456480</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489250</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]
# [Tasks]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]

Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456483</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489249</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]
# [Tasks]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]

Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456482</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489244</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1. You probably want to start up JBoss just to make sure it runs before trying to build SSDS.  Open a command prompt and cd to the jboss installation directory.  Then type 'bin\run.bat' (Windows) or './bin/run.sh' (UNIX).  Once it has finished startup, you should be able to go to http://_myserver_:8080 and see the jboss console.
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below) or set an environment variable name SSDS_BUILD_NAME and that will automatically set the ant property "name".  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.
** *NOTE* In the _myserver_-build.properties (or default-build.properties if you edited those) you will need to set the 
# Setup a HTTP server on the server where SSDS will be deployed an mount the directory where the content.deployment.location pointed to.  This will make all SSDS generated content available through an HTTP server.  For example, if the content.deployment.location property was set to /data/ssds, then create a symbolic link to that directory under the htdocs in your apache and open it up for reading.
# Similarly, you will want to setup a DODS server to point to that directory as well.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456477</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489245</id>
<property name="body"><![CDATA[h1. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reason (security for the SSL case).  These instructions were performed on a Solaris installation,
but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Subversion (TODO: kgomes, more information here when we get open source repository configured.
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
#Download Jboss distribution
#Unzip to an installation location
#Copy custom.properties.template to custom.properties and edit
#Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
#Using mySQL command utility, run the MySQL script to setup DB
#Start JBoss
#Configure mod_jk in Apache/JBoss
#Configure SSL for login.jsp page
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4456478</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945095</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes that represent the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912348</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945094</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|Something SIAM used, but SSDS ignores|
|DevicePacketVersion|java.lang.long|In theory, this would be used to define format of packet, but essentially there is just one format so it should be 0|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912347</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945103</id>
<property name="body"><![CDATA[{anchor:getDataStreamProperties}
{panel:title=searchDataStream}
h5. Background
A service was need to search data streams for some specific text.  This service does not apply to all instruments as not all instruments output ASCII in their packets, but it was deemed handy to have for those that do output ASCII. 
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device whose data stream the user wants to search|Any SSDS ID|N/A|Y|
|Expression|This is the regular expression (Java style) that will be used to search for|Any valid regular expression|N/A|Y|
|PacketOrLine|This is an option that specifies if the service should return the whole packet contents if a match is found, or if just the line out of the packet is found|_PACKET_ or _LINE_|_PACKET_|N|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}
{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912357</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9831013</id>
<property name="body"><![CDATA[Requirements documents for SSDS development:

# [CIMT Requirements]
# [MOOS Science Expermiment Requirements|MSERequirements]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9798260</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9831014</id>
<property name="body"><![CDATA[Requirements documents for SSDS development:

# [CIMT Requirements]
# [MOOS Science Expermiment Requirements|MSERequirements]

h3. Consolidated Requirements

||Number||Requirement||Description||
|1.0|User can merge data from different sources|This should be able to be done by the user selecting variables from various sources and a time frame and then SSDS will return a merged data set in various formats. See John's psuedo-code and perl script.|
|2.0|Data conversions can be done by SSDS|SSDS should support user defined data transformations.  CTD values to salinity is the golden example of this|
|3.0|SSDS should connect up/work with AOSN|?|
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9798261</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945101</id>
<property name="body"><![CDATA[{anchor:getDataStreamProperties}
{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912354</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388419</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied (manually?) to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some information is out of date.

The Rover data is stored in the project share for the Rover (900502.BenthicRover), under Rover.Deployment.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and I believe it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Rover.Documents/Project.Data/ReprocessedData/RoverData_2007-2008_NewFormat.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intend to do this, but will log all data retroactively instead. 

h3. Logging Rover images to SSDS

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (when Rover is physically deployed off a ship, or spends a period of time doing a science or engineering project), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity. This provides an order and hierarchy for the data, and puts different kinds of data into different folders.

Each data file also has a standard format in the normalized scheme, making fields like timestamp the same for all Rover files.

The organization and renaming of files from the old format to the new format was performed manually, and only for those missions that appeared to have any data of interest that could be converted. The reformatting of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terrible name) to either finalize or revoke the changes.

It appears the MARS Roverdeployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident yet.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  Some Perl was written to parse folder names, but that is in a preliminary state.  We have started to verify the metadata submission process, but there are challenges.  All this work was continuing up until my departure. 

The next step will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records (hmm, might be better/faster to do this first?) (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs. (Paul McGill keeps a spreadsheet as current as he can that contains this information; make sure he updates the one that I added a sheet to, as it has a more thorough description of device IDs on all the deployments.)

The data records were most important data elements, but more data files appear to be in the data sets now (not sure which of the additional files are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also prefer to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them directly in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is entirely non-existent. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and putting that metadata in the name is very weak, as noted previously.

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, nor how much will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up on the Rover, to my knowledge.  (Note Oxygen's xsltproc does not correctly handle the XPath/XPointer, and so will not work; you must set the XSLT processor as part of the Transformation configuration settings.)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355691</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388769</id>
<property name="body"><![CDATA[h5. Data Packet Structure
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that the transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Transmogrify Packet Structure

The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte[firstBufferLength])|secondBufferLength (int)|secondBufferBytes (byte[secondBufferLength])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356008</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388768</id>
<property name="body"><![CDATA[h5. Data Packet Structure
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that the transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Transmogrify Packet Structure

The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte[firstBufferLength])|secondBufferLength (int)|secondBufferBytes (byte[secondBufferLength])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long) This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356007</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/showSpaceDetails/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388767</id>
<property name="body"><![CDATA[h5. Data Packet Structure
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that the transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.
Transmogrify Packet Structure

The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:
streamID (short)	devicePacketVersion (long)	sourceID (long)	timestamp (long)	sequenceNumber (long)	metadataRef (long)	parentID (long)	recordType (long)	secondStreamID (short)	secondPacketVersion (long)	firstBufferLength (int)	firstBufferBytes (byte[firstBufferLength])	secondBufferLength (int)	secondBufferBytes (byte[secondBufferLength])
Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:
deviceID (long)	parentID (long)	packetType (int)	packetSubType (long)	dataDescriptionID (long)	dataDescriptionVersion (long)	timestampSeconds (long)	timestampNanoseconds (long)	sequenceNumber (long)	bufferLen (int)	bufferBytes (byte[bufferLen])	bufferTwoLen (int)	bufferTwoBytes (byte[bufferTwoLen])
deviceID (long) This is what is known as the SSDS ID for the device that actually generated the packet of information.
parentID (long) This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
packetType (int) This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet
packetSubType (long) This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.
dataDescriptionID (long)
dataDescriptionVersion (long)
timestampSeconds (long)
timestampNanoseconds (long)
sequenceNumber (long)
bufferLen (int)
bufferBytes (byte[bufferLen])
bufferTwoLen (int)
bufferTwoBytes (byte[bufferTwoLen])
SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.
deviceID (long)	parentID (long)	packetType (int)	packetSubType (long)	dataDescriptionID (long)	dataDescriptionVersion (long)	timestampSeconds (long)	timestampNanoseconds (long)	sequenceNumber (long)	bufferLen (int)	bufferBytes (byte[bufferLen])	bufferTwoLen (int)	bufferTwoBytes (byte[bufferTwoLen])

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356006</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">14</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# &nbsp;[Alfresco Content|http://oceana:8080/alfresco/navigate/showSpaceDetails/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388765</id>
<property name="body"><![CDATA[h5. Data Packet Structure

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356004</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">12</id>
<property name="body"><![CDATA[This is the home page for the 60003 Shore Side Data System space.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">14</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388764</id>
<property name="body"><![CDATA[h5. Data Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_||
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_||
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_||
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356003</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388762</id>
<property name="body"><![CDATA[h5. Data Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  

The DevicePacket had the following attributes
||Name||Type||Description||

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356001</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388760</id>
<property name="body"><![CDATA[h5. Data Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long| |
|Timestamp|java.lang.long| |
|SequenceNumber|java.lang.long| |
|MetadataRef|java.lang.long| |
|ParentID|java.lang.long| |
|RecordType|java.lang.long| |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355999</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7</id>
<property name="body"><![CDATA[This is a project to build a data management system for the Monterey Ocean Observing System (MOOS).]]></property>
<property name="content" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">9</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388758</id>
<property name="body"><![CDATA[h5. Data Packet Structure
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
||Name||Type||Description||


h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355997</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388756</id>
<property name="body"><![CDATA[{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
h5. Data Packet Structure


h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355995</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">33</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10001&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">35</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388753</id>
<property name="body"><![CDATA[The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355992</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">34</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10001&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">36</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388754</id>
<property name="body"><![CDATA[h5. Data Packet Structure


h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355993</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388751</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h3. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355990</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">32</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">34</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">29</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">31</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388749</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h3. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355988</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">30</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:

{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary&os_username=kgomes&os_password=cAn0jAh01}

# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">32</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388747</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h3. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)|
*** Specify gap constraints
**** Gap in milliseconds

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355986</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">25</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]

{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">27</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670788</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638041</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">26</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]

{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">28</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388746</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h3. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)|
*** Specify gap constraints
**** Gap in milliseconds

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355985</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">23</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">25</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670790</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638043</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388744</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h3. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Specify gap constraints
*** Gap in milliseconds
*** margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
** Let service calculate gap constraints (calculate average time between sample)
*** Number of points to use (points back from most recent packet)
*** Or time window to use (start to end time)
|
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355983</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670792</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638045</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670794</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638047</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273163</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA and unzipped it to the C:\bin\jboss-4.2.2GA directory
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240426</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273158</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240421</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">39</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;assignee;reporter;status;res;created;updated}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">41</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">42</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;assignee;reporter;priority;status;res;created;updated}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">44</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273156</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240419</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">41</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;assignee;reporter;pr;status;res;created;updated}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">43</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273161</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.
# I then browsed to http://jboss.org and downloaded JBoss 4.2.2GA.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240424</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273159</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable
# I installed the Apache HTTP server by browsing to http://httpd.apache.org and I downloaded the Win32 Binary including OpenSSL for 2.2.15
## Again, 'cause I am weird and old, I installed it to C:\bin\Apache2.2 and accepted the default values
{note:title=Did not use Apache}
Turns out IIS was installed already, so I just used that
{note}
# In order to use IIS to get HTTP access to SSDS files, I had to configure it for directory browsing.
## Under Control Panel->Administrative Tools->Internet Information Services, right-click on Default Web Site and select Properties.
## Then on the Home Directory tab, check the box next to Directory browsing.
# I created the directory C:\Inetpub\wwwroot\ssdsdata where I will have SSDS store everything.  With the data there, it will then be HTTP accessible.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240422</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">38</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;assignee;reporter;status}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">40</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">37</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary}
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Issue Tracker|http://oceana:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">39</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268874</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

h4. A. Initial look at the data


Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

h4. B. Fixing the start times for all the child instrument deployments


All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

h4. C. Examining the gridding method


There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.

h4. D. Testing the results of the gridding

It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.

{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0040_20101027_original.nc"
plot/symbol=1 temperature[d=3]
plot/ov SEA_WATER_TEMPERATURE_HR[k=4,d=1]

{noformat}
Gives:

 !m1_compare_20.gif|thumbnail!

 !m1_compare_40.gif|thumbnail!

We obviously still have some gridding issues...

Now is the time to iterate using our method of starting with the .jnl file that aggregates and grids the data to the OceanSITES \_TS.nc file.
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236110</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268872</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0040_20101027_original.nc"   
plot/symbol=1 temperature[d=3]
plot/ov SEA_WATER_TEMPERATURE_HR[k=4,d=1]

{noformat}
Gives:

  !m1_compare_20.gif|thumbnail!

  !m1_compare_40.gif|thumbnail!


We obviously still have some gridding issues...

Now is the time to iterate using our method of starting with the .jnl file that aggregates and grids the data to the OceanSITES _TS.nc file.
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236108</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388779</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from SSDS using Matlab|SSDS:Analyzing signals from SSDS using Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356018</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">59</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:

# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=reporter&sorter/order=ASC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;res;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">61</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268870</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

{noformat}
Gives:

&nbsp;
&nbsp;
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236106</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">60</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=reporter&sorter/order=ASC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">62</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388781</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from SSDS using Matlab|Analyzing signals from MARS using SSDS and Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356020</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">61</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">63</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268868</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats: !m1_shade.gif|thumbnail!
&nbsp;
&nbsp;
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236104</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">62</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">64</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">55</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:

{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;assignee;reporter;priority;status;res;created;updated}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">57</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388776</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause|_inherited_|_inherited_|_inherited_|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated|
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356015</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">56</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;res;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">58</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388778</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes| | |dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
| |_cause| | |otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the |
| | |_dataBuffer| |dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
| | | |_statusBytes| |_inherited_| |
| | | |_cause| |_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356017</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">58</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=reporter&sorter/order=ASC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;res;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">60</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388771</id>
<property name="body"><![CDATA[h5. Data Packet Structure
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that the transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Transmogrify Packet Structure

The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356010</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388773</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356012</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388774</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes|_inherited_|_inherited_|_inherited_|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.|
| |_cause_|_inherited_|_inherited_|_inherited_|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated|
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |
| |_inherited_|_inherited_|_inherited_|_inherited_|_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356013</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">77</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

Project Documentation:
# Project Documents
# Project Drawings
# Project Memos and Minutes
# Project Presentations
# Project Purchase Orders

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">79</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388829</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

Once converted to a SSDSDevicePacket (or SSDSGeoLocatedDevicePacket), transmogrify would immediately turn around, convert that to an array of bytes (using the statuce SSDSDevicePacket.convertToPublishableByteArray method) in order to send to the Ingest MDB.  The created a byte array of the form:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356070</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">76</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

Project Documentation:
# Project Documents
# Project Drawings
# Project Memos and Minutes
# Project Presentations
# Project Purchase Orders

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">78</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">75</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

Project Documentation:
# Project Documents
# Project Drawings
# Project Memos and Minutes
# Project Presentations
# Project Purchase Orders

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">77</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388827</id>
<property name="body"><![CDATA[{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

Once converted to a SSDSDevicePacket (or SSDSGeoLocatedDevicePacket), transmogrify would immediately turn around, convert that to an array of bytes (using the statuce SSDSDevicePacket.convertToPublishableByteArray method).  The created a byte array of the form:

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356068</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">82</id>
<property name="body"><![CDATA[h1. Requirements For MOOS Science Experiment

# General Requirements
## A website like that of CIMT/MTM
## A request for calibrated salinity instead of conductivity was made.
## A general comment was made how we should have something in place to notify data users that they need to acknowledge MBARI if data is used.
## Make sure ITD is OK with sharing images from camera and if 1 year embargo applies to that data.
# Instrument specific requirements
## MTM-4 Surface Node (*SSDS ID 1446*): There appear to be no real SSDS requirements for this.  There is no XML defined for this
### Satlantic Radiometer (*SSDS ID 1270*): This is a binary instrument that needs special processing to do anything useful with.  We have XML defined for it, but I suspect it is out of date.  The XML simply states that the DataStream is binary.
### Triaxys directional wave sensor (*SSDS ID 1286*):  This instrument has a fairly well behaved data structure. It does not appear that we have XML defined for this instrument, but we should.  I know it has been deployed and we are generating plots for it for MTM-3 which has ID of 1339.  Here is an example of a data record:
{{$WC,81,060108,1640,13.37,6000,01020,3.33,,132,0,-0.230,0.000,1.700,0.00,28.6,0.00,249,75,4308}}
### Heave Sensor (is this the Triaxys above?)
#### Unknown, assuming it will be just like plots on CIMT
### GPS (*SSDS ID 1287*): This is a standard GPS that we have been dealing with.  We have XML defined, but we need an application that user's can configure a watch circle and set an alarm that will send an email if it goes outside the circle.  Here is an example data record:
{{$GPRMC,104538,A,3648.2007,N,12147.2515,W,000.0,329.4,291105,014.8,E  * 6E}}
### ASIMET LWR (*SSDS ID 1289*): We have seen these instruments before.  We don't have any XML in CVS for it, but it seems like we should.  There might be a similar instrument on another deployment that we can take the XML from.  Here is an example of the data record 
{{294.45 294.46 11614.4 11597.3 -74.0 425.0 33284 33438 32760}}
### Radiometer, Long-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Short-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### ASIMET HRH (*SSDS ID 1290*): Again, one we have seen before, but no XML.  We should have some elsewhere.  Here is an example data record:
{{40.634 21.746 : 38124 40892}}
### Relative Humidity - Air Temp., ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### ASIMET WND (*SSDS ID 1291*): Same, no XML, but we have instruments just like it.  Here is an example of the data:
{{0.00 0.00 0.0 0.0 0.0 147.8 333.2 -4.8 4.7}}
### Wind Speed/Direction, ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### Power Can (*SSDS ID 1322*): We have XML, but we need to see if anything has changed.  A (large) example of the data (consult the data stream for more info):
{{ADC00 A+1.5209e-04 N0000600 L+1.5260e-03 H-1.2208e-03 D-3.0520e-04 E0}}
{{ADC01 A+1.8414e-04 N0000600 L+1.2208e-03 H-9.1560e-04 D-3.0520e-04 E0}}
{{ADC02 A+7.8088e-02 N0000600 L+7.3778e-02 H+8.1754e-02 D+0.0000e+00 E0}}
### Load cell 0-10,000 lbs. version A (Bridle)
#### Unknown, assuming it will be just like plots on CIMT
### P2 ADC
#### Unknown, assuming it will be just like plots on CIMT
### Nitrate Analyzer, ISUS
#### Assuming that Luke will be creating (or adding to the current) ISUS page for this, we will just link to it.
### CTD (SBE 37SM)
#### Unknown
### Current Meter, ADCP, RDI Long Ranger, 600m range
#### John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
### SeaHorse Profiler (*SSDS ID 1405*): This is a binary format.  I think it is a gzipped set of data for each record, but need to chech with Andy Hamilton about it.  There is XML for it, but we just say binary.
### MBARI Medusa (*SSDS ID 1441*): There is not XML for this and I think this is a new instrument.  We have not seen any data yet, I only see:
{{ERR: Timeout;Timeout;Timeout;retry limit exceeded}}
### ASIMET BPR (*SSDS ID 1443*): There is no XML for this and the data looks like:
{{1025.42 1025.42}}
### Pressure, Barometric, ASIMET (Is this the same as above?)
#### Unknown
      1. MSP430 ('''SSDS ID 1447'''): Although this instrument does not have XML specifically, we have seen this many times before.  Data looks like {{{
$PEDATA, P1023.73, T27.63, H43.08, GFL0.00, GFH0.00, C301.46, TC0.00,   * 3688
}}}
      1. SOON/PCO2 ('''SSDS ID 1448'''): Plots of raw data like on CIMT.  QC Processing will run and plots of that data as well. No XML, but we have seen this instrument before.  No data coming yet, we get {{{
ERR: while preparing to sample
}}}
      1. Flourometer/Backscatter, Hobielabs HS2 (5000m)
        1. Unknown
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Es(air)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Ed-w (water, downwelling)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Lu-w (water, upwelling)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
    1. MSE Axis BIN Medusa subnode 1 ('''SSDS ID 1408'''): This one only sends message packets, no data
      1. MSP430 ('''SSDS ID 1411'''): This is the same as the MSP430 on other nodes.
      1. MBARI Medusa ('''SSDS ID 1441'''): This has no XML and no current data, but I went back a couple days and found data that looks like: {{{
-> channel=0, temp=48.51, vcc=3.2316, txBiasI=3.9796, txPower=0.4652, rxPower=0.0717, status=0x0 channel=3, temp=51.10, vcc=3.2252, txBiasI=4.4665, txPower=0.5313, rxPower=0.1337, status=0x0
}}}
      1. Medusa  ('''SSDS ID 1485'''): Looks like the previous (might have actually replaced that one because it has current data).{{{
-> channel=0, temp=51.69, vcc=3.2208, txBiasI=4.2839, txPower=-3.3320, rxPower=-10.6312, status=0x0 channel=3, temp=54.25, vcc=3.2142, txBiasI=4.7679, txPower=-2.7678, rxPower=-8.7681, status=0x0
}}}
      1. Digital Camera
        1. Thumbnail page of all images from the camera (click on image to get full image)
        1. Sounds like images will come back as encapsulated JPG
      1. CTD (SBE 16+)
        1. Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
    1. MSE Axis BIN Medusa subnode 2 ('''SSDS ID 1409'''): Again, just message packets.
      1. MSP430 ('''SSDS ID 1413'''): Again, another MSP. Nothing new and has current data.
      1. MBARI Medusa ('''SSDS ID 1442'''): No current data, but recent data looks like {{{
-> channel=3, temp=49.40, vcc=3.2308, txBiasI=2.6144, txPower=0.5348, rxPower=0.2863, status=0x0
}}}
      1. Medusa ('''SSDS ID 1486'''):{{{
-> channel=3, temp=50.25, vcc=3.2476, txBiasI=2.6434, txPower=-2.6995, rxPower=-5.3036, status=0x0
}}}
      1. Digital Camera
        1. Thumbnail page of all images from the camera (click on image to get full image)
        1. Sounds like images will come back as encapsulated JPG
      1. CTD (SBE 16+)
        1. Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
      1. Vertical Profiler, McLane(FSI velocity, Seapoint OBS, Wetlabs FL, CT&P)
        1. Unknown
    1. Sediment Trap, Honjo
      1. Unknown
    1. Sediment Trap, IRS
      1. Unknown
  1. Outstanding Issues:
    1. Instrument questions:
      1. ASIMET LWR (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Radiometer, short-wave (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Relative Humidity and Temperature (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Wind Speed Direction (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. Power Can (Ed Mellinger): Any new features/graphs
      1. Load Cell(Lance McBride): Any processing, any new plots?
      1. Seahorse(Andy Hamilton): Any processing, feedback or data plots from seahorse?  Any linked images?  Do you want processing and products tracked?
      1. MBARI Medusa(Mark Chaffey): Do we want plots of any of this data?  Any post processing (and resubmit/track)?
      1. ASIMET Barometric(Chavez or Ryan): Do plots of raw data make sense?  Any post processing (and resubmit/track)?
      1. All Satlantic Hyperspectral Radiometers (Chavez/Ryan): What/who is going to do the post processing.  What does it look like and can we feedback/link to the results.
      1. Digital Camera (Jim Barry, Mark Chaffey): is still an unknown as to what will be returned to SSDS.  Mark sent request to Jim B for requirements from the camera and that will help answer the questions for SSDS.
      1. CTD (SBE 16+) (Bill Ussler/Doug Conlin): Seabird software was identified as possibly doing the post processing, need to understand process in detail
      1. ADCP RDI Sentinel (Coenen): What is the post processing for this instrument?  Can we feedback/link data products?
      1. Aquadopp (Ussler): Contact Leslie to get post processing software.
      1. Wetlabs ECO BB2F Triplett (Ussler): Follow up to try and get example data to figure out what next steps are
      1. Aanderaa Oxygen (Barry): Need to follow up to see what the data looks like and what post processing will be done.
      1. Nephalomter (Ussler): Get details on post processing. Is this a SIAM instrument?
      1. McLane Profiler(Hamilton): Get any details on post processing and if it is to link back to SSDS.
      1. Sediment Traps(Chavez): What will the data look like, are we going to put that in SSDS?
    1. General Issues:
    1. No decision has been made on MBARI's data policy for this experiment, currently the SSDS team is assuming all data will be open. The public access to data issue was discussed and the next step is to have the scientist's meet to come up with idea of how MSE data should be accessed by the public (if at all) and then give that feedback to the MT for review/approval (note the current default is that data that goes into SSDS is public)
    1. Documentation in spreadsheet incomplete -- we need to go to each of the reps and collect this data
      1. Don't know driver writers for many nominally SIAM instruments
    1. Not sure what the summary/snapshot data (ADCP, OCR, Nortek, Weblabs) will look like and if we are supposed to do anything with it.

== Related Data Management Systems and Projects ==
  1. [http://www.openioos.org/index.html OpenIOOS.org]
  1. [http://www.geongrid.org GEON]
  1. [https://www.earthsystemgrid.org Earth Systems Grid]
  1. [http://oceanexplorer.noaa.gov/ NOAA's OceanExplorer]
  1. [http://www.gomoos.org/ GOMOOS]
  1. [http://www.seamaven.org/sm.swf SeaMaven]
  1. [http://seacoos.org/ SEACOOS]
  1. [http://www.thecoolroom.org/ The COOL Room]
  1. [http://earthobservations.org/ EARTH Observations]
  1. [http://strategies.org/ Strategies.org]
  1. [http://www.epic.noaa.gov/epic/software/dapper/ DAPPER (Look at DAPPER to serve SSDS data)]
  1. [http://www.pacoos.org/ PACOOS]
  1. [http://www.cencoos.org/ CENCOOS]
  1. [http://egy.org/ EGY]
  1. [http://www.oceansites.org/OceanSITES/ OceanSITES]
  1. [http://ingrid.ldgo.columbia.edu/ LDGO]
  1. Christoph Waldman (University of Bremen, Germany) (presented at MBARI on Jan 9, 2006)
    1. Sensor interoperability and standardisation
    1. ESONET I and ESONET II + ESONIM, KM2NET, ANTARES, ORION
    1. He is working on standardized data quality and semantics
    1. Quality Control: important to always state accuracy
    1. Using SensorML to describe the sensor and data from sensor (but does not address semantics)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">84</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">81</id>
<property name="body"><![CDATA[h1. Requirements For MOOS Science Experiment

# General Requirements
## A website like that of CIMT/MTM
## A request for calibrated salinity instead of conductivity was made.
## A general comment was made how we should have something in place to notify data users that they need to acknowledge MBARI if data is used.
## Make sure ITD is OK with sharing images from camera and if 1 year embargo applies to that data.
# Instrument specific requirements
## MTM-4 Surface Node (*SSDS ID 1446*): There appear to be no real SSDS requirements for this.  There is no XML defined for this
### Satlantic Radiometer (*SSDS ID 1270*): This is a binary instrument that needs special processing to do anything useful with.  We have XML defined for it, but I suspect it is out of date.  The XML simply states that the DataStream is binary.
### Triaxys directional wave sensor (*SSDS ID 1286*):  This instrument has a fairly well behaved data structure. It does not appear that we have XML defined for this instrument, but we should.  I know it has been deployed and we are generating plots for it for MTM-3 which has ID of 1339.  Here is an example of a data record:
{{$WC,81,060108,1640,13.37,6000,01020,3.33,,132,0,-0.230,0.000,1.700,0.00,28.6,0.00,249,75,4308}}
### Heave Sensor (is this the Triaxys above?)
#### Unknown, assuming it will be just like plots on CIMT
### GPS (*SSDS ID 1287*): This is a standard GPS that we have been dealing with.  We have XML defined, but we need an application that user's can configure a watch circle and set an alarm that will send an email if it goes outside the circle.  Here is an example data record:
{{$GPRMC,104538,A,3648.2007,N,12147.2515,W,000.0,329.4,291105,014.8,E  * 6E}}
### ASIMET LWR (*SSDS ID 1289*): We have seen these instruments before.  We don't have any XML in CVS for it, but it seems like we should.  There might be a similar instrument on another deployment that we can take the XML from.  Here is an example of the data record {{{
294.45 294.46 11614.4 11597.3 -74.0 425.0 33284 33438 32760
}}}
      1. Radiometer, Long-wave, ASIMET (is this the same as above?)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. Radiometer, Short-wave, ASIMET (is this the same as above?)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. ASIMET HRH ('''SSDS ID 1290'''): Again, one we have seen before, but no XML.  We should have some elsewhere.  Here is an example data record:{{{
40.634 21.746 : 38124 40892
}}}.
      1. Relative Humidity - Air Temp., ASIMET (is this the same as above?)
        1. Unknown, but assuming it will be like current mooring ASIMETs
      1. ASIMET WND ('''SSDS ID 1291'''): Same, no XML, but we have instruments just like it.  Here is an example of the data:{{{
0.00 0.00 0.0 0.0 0.0 147.8 333.2 -4.8 4.7
}}}
      1. Wind Speed/Direction, ASIMET (is this the same as above?)
        1. Unknown, but assuming it will be like current mooring ASIMETs
      1. Power Can ('''SSDS ID 1322'''): We have XML, but we need to see if anything has changed.  A (large) example of the data (consult the data stream for more info):{{{
ADC00 A+1.5209e-04 N0000600 L+1.5260e-03 H-1.2208e-03 D-3.0520e-04 E0
ADC01 A+1.8414e-04 N0000600 L+1.2208e-03 H-9.1560e-04 D-3.0520e-04 E0
ADC02 A+7.8088e-02 N0000600 L+7.3778e-02 H+8.1754e-02 D+0.0000e+00 E0
}}}
      1. Load cell 0-10,000 lbs. version A (Bridle)
        1. Unknown, assuming it will be just like plots on CIMT
      1. P2 ADC
        1. Unknown, assuming it will be just like plots on CIMT
      1. Nitrate Analyzer, ISUS
        1. Assuming that Luke will be creating (or adding to the current) ISUS page for this, we will just link to it.
      1. CTD (SBE 37SM)
        1. Unknown
      1. Current Meter, ADCP, RDI Long Ranger, 600m range
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. SeaHorse Profiler ('''SSDS ID 1405'''): This is a binary format.  I think it is a gzipped set of data for each record, but need to chech with Andy Hamilton about it.  There is XML for it, but we just say binary.
      1. MBARI Medusa ('''SSDS ID 1441'''): There is not XML for this and I think this is a new instrument.  We have not seen any data yet, I only see:{{{
ERR: Timeout;Timeout;Timeout;retry limit exceeded
}}}
      1. ASIMET BPR ('''SSDS ID 1443'''): There is no XML for this and the data looks like:{{{
1025.42 1025.42
}}}
      1. Pressure, Barometric, ASIMET (Is this the same as above?)
        1. Unknown
      1. MSP430 ('''SSDS ID 1447'''): Although this instrument does not have XML specifically, we have seen this many times before.  Data looks like {{{
$PEDATA, P1023.73, T27.63, H43.08, GFL0.00, GFH0.00, C301.46, TC0.00,   * 3688
}}}
      1. SOON/PCO2 ('''SSDS ID 1448'''): Plots of raw data like on CIMT.  QC Processing will run and plots of that data as well. No XML, but we have seen this instrument before.  No data coming yet, we get {{{
ERR: while preparing to sample
}}}
      1. Flourometer/Backscatter, Hobielabs HS2 (5000m)
        1. Unknown
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Es(air)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Ed-w (water, downwelling)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
      1. Radiometer, Satlantic 350-800nm, Hyperspectral Lu-w (water, upwelling)
        1. Unknown, but assuming similar to post processing done on other mooring radiometers
    1. MSE Axis BIN Medusa subnode 1 ('''SSDS ID 1408'''): This one only sends message packets, no data
      1. MSP430 ('''SSDS ID 1411'''): This is the same as the MSP430 on other nodes.
      1. MBARI Medusa ('''SSDS ID 1441'''): This has no XML and no current data, but I went back a couple days and found data that looks like: {{{
-> channel=0, temp=48.51, vcc=3.2316, txBiasI=3.9796, txPower=0.4652, rxPower=0.0717, status=0x0 channel=3, temp=51.10, vcc=3.2252, txBiasI=4.4665, txPower=0.5313, rxPower=0.1337, status=0x0
}}}
      1. Medusa  ('''SSDS ID 1485'''): Looks like the previous (might have actually replaced that one because it has current data).{{{
-> channel=0, temp=51.69, vcc=3.2208, txBiasI=4.2839, txPower=-3.3320, rxPower=-10.6312, status=0x0 channel=3, temp=54.25, vcc=3.2142, txBiasI=4.7679, txPower=-2.7678, rxPower=-8.7681, status=0x0
}}}
      1. Digital Camera
        1. Thumbnail page of all images from the camera (click on image to get full image)
        1. Sounds like images will come back as encapsulated JPG
      1. CTD (SBE 16+)
        1. Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
    1. MSE Axis BIN Medusa subnode 2 ('''SSDS ID 1409'''): Again, just message packets.
      1. MSP430 ('''SSDS ID 1413'''): Again, another MSP. Nothing new and has current data.
      1. MBARI Medusa ('''SSDS ID 1442'''): No current data, but recent data looks like {{{
-> channel=3, temp=49.40, vcc=3.2308, txBiasI=2.6144, txPower=0.5348, rxPower=0.2863, status=0x0
}}}
      1. Medusa ('''SSDS ID 1486'''):{{{
-> channel=3, temp=50.25, vcc=3.2476, txBiasI=2.6434, txPower=-2.6995, rxPower=-5.3036, status=0x0
}}}
      1. Digital Camera
        1. Thumbnail page of all images from the camera (click on image to get full image)
        1. Sounds like images will come back as encapsulated JPG
      1. CTD (SBE 16+)
        1. Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
      1. Vertical Profiler, McLane(FSI velocity, Seapoint OBS, Wetlabs FL, CT&P)
        1. Unknown
    1. Sediment Trap, Honjo
      1. Unknown
    1. Sediment Trap, IRS
      1. Unknown
  1. Outstanding Issues:
    1. Instrument questions:
      1. ASIMET LWR (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Radiometer, short-wave (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Relative Humidity and Temperature (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Wind Speed Direction (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. Power Can (Ed Mellinger): Any new features/graphs
      1. Load Cell(Lance McBride): Any processing, any new plots?
      1. Seahorse(Andy Hamilton): Any processing, feedback or data plots from seahorse?  Any linked images?  Do you want processing and products tracked?
      1. MBARI Medusa(Mark Chaffey): Do we want plots of any of this data?  Any post processing (and resubmit/track)?
      1. ASIMET Barometric(Chavez or Ryan): Do plots of raw data make sense?  Any post processing (and resubmit/track)?
      1. All Satlantic Hyperspectral Radiometers (Chavez/Ryan): What/who is going to do the post processing.  What does it look like and can we feedback/link to the results.
      1. Digital Camera (Jim Barry, Mark Chaffey): is still an unknown as to what will be returned to SSDS.  Mark sent request to Jim B for requirements from the camera and that will help answer the questions for SSDS.
      1. CTD (SBE 16+) (Bill Ussler/Doug Conlin): Seabird software was identified as possibly doing the post processing, need to understand process in detail
      1. ADCP RDI Sentinel (Coenen): What is the post processing for this instrument?  Can we feedback/link data products?
      1. Aquadopp (Ussler): Contact Leslie to get post processing software.
      1. Wetlabs ECO BB2F Triplett (Ussler): Follow up to try and get example data to figure out what next steps are
      1. Aanderaa Oxygen (Barry): Need to follow up to see what the data looks like and what post processing will be done.
      1. Nephalomter (Ussler): Get details on post processing. Is this a SIAM instrument?
      1. McLane Profiler(Hamilton): Get any details on post processing and if it is to link back to SSDS.
      1. Sediment Traps(Chavez): What will the data look like, are we going to put that in SSDS?
    1. General Issues:
    1. No decision has been made on MBARI's data policy for this experiment, currently the SSDS team is assuming all data will be open. The public access to data issue was discussed and the next step is to have the scientist's meet to come up with idea of how MSE data should be accessed by the public (if at all) and then give that feedback to the MT for review/approval (note the current default is that data that goes into SSDS is public)
    1. Documentation in spreadsheet incomplete -- we need to go to each of the reps and collect this data
      1. Don't know driver writers for many nominally SIAM instruments
    1. Not sure what the summary/snapshot data (ADCP, OCR, Nortek, Weblabs) will look like and if we are supposed to do anything with it.

== Related Data Management Systems and Projects ==
  1. [http://www.openioos.org/index.html OpenIOOS.org]
  1. [http://www.geongrid.org GEON]
  1. [https://www.earthsystemgrid.org Earth Systems Grid]
  1. [http://oceanexplorer.noaa.gov/ NOAA's OceanExplorer]
  1. [http://www.gomoos.org/ GOMOOS]
  1. [http://www.seamaven.org/sm.swf SeaMaven]
  1. [http://seacoos.org/ SEACOOS]
  1. [http://www.thecoolroom.org/ The COOL Room]
  1. [http://earthobservations.org/ EARTH Observations]
  1. [http://strategies.org/ Strategies.org]
  1. [http://www.epic.noaa.gov/epic/software/dapper/ DAPPER (Look at DAPPER to serve SSDS data)]
  1. [http://www.pacoos.org/ PACOOS]
  1. [http://www.cencoos.org/ CENCOOS]
  1. [http://egy.org/ EGY]
  1. [http://www.oceansites.org/OceanSITES/ OceanSITES]
  1. [http://ingrid.ldgo.columbia.edu/ LDGO]
  1. Christoph Waldman (University of Bremen, Germany) (presented at MBARI on Jan 9, 2006)
    1. Sensor interoperability and standardisation
    1. ESONET I and ESONET II + ESONIM, KM2NET, ANTARES, ORION
    1. He is working on standardized data quality and semantics
    1. Quality Control: important to always state accuracy
    1. Using SensorML to describe the sensor and data from sensor (but does not address semantics)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">83</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388833</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356076</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388831</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.

The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Once converted to a SSDSDevicePacket (or SSDSGeoLocatedDevicePacket), transmogrify would immediately turn around, convert that to an array of bytes (using the statuce SSDSDevicePacket.convertToPublishableByteArray method) in order to send to the Ingest MDB.  The created a byte array of the form:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}


Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356072</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388821</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X| |_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_| |
|X|X|X|X|X|packetType|_inherited_| |
|X|X|X|X|X|X|longitude| |
|X|X|X|X|X|X|latitude| |
|X|X|X|X|X|X|depth| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356062</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388819</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
| |_bytes| | | |dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
| |_cause| | | |otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the |
| | |_dataBuffer| | |dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
| | | | |_statusBytes| |_inherited_| |
| | | | |_cause| |_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356060</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">74</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. 

Project Documentation:
# ProjectDocuments
# ProjectDrawings
# ProjectMemosMinutes
# ProjectPresentations
# ProjectPurchaseOrders

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">76</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">73</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project. Here are some related links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&status=1&status=3&status=4&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">75</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388824</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

Once converted to a SSDSDevicePacket (or SSDSGeoLocatedDevicePacket), transmogrify would immediately turn around, convert that to an array of bytes (using the statuce SSDSDevicePacket.convertToPublishableByteArray method).  The created a byte array of the form:

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356065</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388823</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356064</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273152</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240415</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388814</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes| | | |dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
| |_cause| | | |otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the |
| | |_dataBuffer| | |dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
| | | | |_statusBytes| |_inherited_| |
| | | | |_cause| |_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356055</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273154</id>
<property name="body"><![CDATA[For the CANON project, Jnaneshwar Das at USC wanted to get SSDS installed to manage the data from their gliders.  He setup a WindowsXP machine with the following information:

# Hostname: amphisbaena.usc.edu
# Static IP: 128.125.125.51
# Username: kevin

Here are the steps I took to install and configure SSDS (all the downloaded files went into the 'SSDS Installation' directory on the Desktop):

# I logged in to the Windows machine using Remote Desktop
# I opened up Internet Explorer and browsed to http://java.sun.com
# I downloaded Java SE 6 *JDK* and ran the .exe to install it
## I am weird, but I changed the default installation location to C:\bin\Java\jdk1.6.0_18 (I hate spaces in directories and paths)
## Same with the JRE, I installed it to C:\bin\Java\jre6
## Also, create an environment variable for JAVA_HOME and point it to the Java *JDK* location
# After installing Java, I browsed to http://ant.apache.org and downloaded Ant 1.8.0 (I won't go through the steps here, but don't forget to add the ANT_HOME environment variable and the ANT_HOME\bin directory to the PATH environment variable]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240417</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">91</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## MBARI Examples
### [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
### [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
### [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
### [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
### [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
### [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out.
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">93</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">92</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out.
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">94</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388812</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS, was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This |
| |_bytes| | | |dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
| |_cause| | | |otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the |
| | |_dataBuffer| | |dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
| | | | |_statusBytes| |_inherited_| |
| | | | |_cause| |_inherited_| |

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short| |
|DevicePacketVersion|java.lang.long| |
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* |
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |


The packet structure for Transmogrify is a bit different than for Ingest as it does some special processing for SIAM generated packets. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Transmogrify receives one of these messages, it attempts to deconstruct the message into the following structure:

|streamID (short)|devicePacketVersion (long)|sourceID (long)|timestamp (long)|sequenceNumber (long)|metadataRef (long)|parentID (long)|recordType (long)|secondStreamID (short)|secondPacketVersion (long)|firstBufferLength (int)|firstBufferBytes (byte\[firstBufferLength\])|secondBufferLength (int)|secondBufferBytes (byte\[secondBufferLength\])|

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356053</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670860</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}

h3. new-ssds.mbari.org

# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638121</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11273149</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# If your platform does not already have Java installed, install it.  You will need the SDK for Java 1.5+ (not just the JRE) in order to build and run the Shore Side Data System.  For the OS X installation, it was already part of the OS, but if not, you will most likely retrieve it from [http://java.sun.com]. (The details of a Java installation are not listed here).
# Install Ant which can be retrieved from [http://ant.apache.org/]. Ant 1.7.0 was used during the development of these instructions.  You will want to make sure that the bin directory of the Ant installation is in your path so that you can run 'ant' from any command line location.
# Install an instance of an Apache 2 web server.  The scope of this installation is outside these instructions, but once you have the apache web server installed, make sure there is a directory where users can get http access to file and directory listings.  All SSDS data files and generated products will be stored in some local directory.  The idea is that you make that directory available through an HTTP server and all SSDS managed assets become available over HTTP.  So once you have installed Apache and have a directory that can be browsed via http, remember the local directory location for later.  For example, on the Mac, an Apache server is already installed and if you turn on Web Sharing, you can make your /Users/kgomes/Sites directory available via HTTP.  So, I chose to create a directory in my Sites folder called ssdsdata that is then browseable via http://localhost/~kgomes/ssdsdata.  So the directory to remember is:
{noformat}
content.directory.location=/Users/kgomes/Sites/ssdsdata
{noformat}
{note:title=TODO detail an installation of OPeNDAP on Apache}
It is helpful to add an OPeNDAP server to the apache server so some of the products can be served via OPeNDAP.  I still need to document how to do that.
{note}
# The next thing to do is install version 4.2.2GA of JBoss.  You can retrieve that from [http://jboss.org].  After you download the .ZIP file, you can simply unzip it to create a new jboss-4.2.2GA folder.  For this example, I unzipped the file to /Applications on the Mac so my Jboss home directory is.  You will want to make sure you have full write and execution permissions on this directory.
{noformat}
jboss.home=/Applications/jboss-4.2.2.GA
{noformat}
{note:title=Feel free to Run JBoss}
Just to make sure that JBoss will run OK, I usually like to run it once before building SSDS just to make sure it runs OK.  Open a command prompt (terminal) and cd to the jboss home directory.  Then run (at least on the Mac):
{noformat}
sudo ./bin/run.sh
{noformat}
A whole bunch of stuff should go by and eventually you should see something like:
{noformat}
16:37:08,072 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 9s:33ms
{noformat}
This means JBoss is up and running. You can also browse to [http://localhost:8080] and make sure you can view it through a browser.  You can then shutdown JBoss by going back to the terminal window and typing Cntl-C.
{note}
# For Flex development, download and install the Adobe Flex SDK.  You can download the SDK from [http://opensource.adobe.com/wiki/display/flexsdk/Downloads].  For this example, I installed it to the /Applications folder so I ended up with:
{noformat}
FLEX_HOME=/Applications/flex_sdk_3.3.0.4852
{noformat}
# Now you will need to setup the database server where you want the SSDS to store the metadata and data that it manages.  These instructions show how to do it on a remote Microsoft SQL Server, but at some point, I will try to write up parallel instructions for MySQL.  I will not go through the setup of the SQL Server, but once it is up and running, you will need to create two databases.  For these instructions, I created 'SSDS_Data' and 'SSDS_Metadata'.  Also, create an account that has database ownership on both and remember the following information for later:
{noformat}
database.server.name=database.host.name
database.server.login.username=dbo_username
database.server.login.password=dbo_password
{noformat}
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# You should now have everything you need installed to get the SSDS up and running.  The next step is to configure properties so that you can build and deploy the SSDS components to their various locations and then startup JBoss to start the SSDS.  In order to configure the build to be appropriate for you configuration, you will need to create a custom.properties file in the root of the SSDS code base and set all the properties to match you installation.  Fortunately, we have created a template that you can work from.  Copy custom.properties.template to custom.properties and then edit the properties to match your configuration.  Use the instructions in the template to help you define the properties correctly and you will need the information gathered above to complete the property configuration.
# During the custom.properties configuration, you defined various aspects for the LDAP security that will back the SSDS.  You need to then define security roles (i.e. LDAP groups) in src/web/src/WEB-INF/web.xml
{noformat}
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>login result page</web-resource-name>
			<url-pattern>/loginResult.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<!-- Place your LDAP groups that are authorized to login here -->
			<role-name>Engineering Distribution List</role-name>
			<role-name>Research Distribution List</role-name>
			<role-name>ITD Distribution List</role-name>
			<role-name>DMO Distribution List</role-name>
			<role-name>OED Distribution List</role-name>
		</auth-constraint>
	</security-constraint>
{noformat}
# Whew, once all that is done, you are ready to build and deploy the SSDS. Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}
ant -Dtarget=deploy
{noformat}
# Once the build is complete, open a terminal window, change directory to where the JBoss home is, and start JBoss
{noformat}
sudo ./bin/run.sh
{noformat}
# Once JBoss finishes startup, you should see the line:
{noformat}
17:12:41,607 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 19s:45ms
{noformat}
and hopefully you did not see any stack traces fly by during startup.  If all looks OK, you should be able to go the SSDS_Metadata database and see newly created tables that will be where SSDS will store is metadata.  You can also open a browser and go to [http://localhost:8080/ssds-docs/] to see a simple page with some links to SSDS documentation and various utilities and libraries.
{note:title=Still to document}
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
{note}

h3. Setup an Eclipse project:
In order to actually do some development on the SSDS code base, you can use an IDE like Eclipse to edit the code and use ant to deploy your changes to JBoss.  To setup an Eclipse project.
# Install eclipse that you download from [http://www.eclipse.org]
# Startup Eclipse and select File->New->Java Project.
# In the New Project Window, select 'Create project from existing source' and browse to where you checked out the SSDS source code.  Once you configure the project correctly, you should have the following project settings:
## There should be two source directories:
{noformat}
src/java
{noformat}
and
{noformat}
src/gen
{noformat}
(src/gen is created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

h3. Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/build/flex and choose it for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}
# Click on Finish

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11240412</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">85</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|ProjectMemosMinutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">87</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">86</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|ProjectMemosMinutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MTM-3 Web App|http://ssdspub.mbari.org:8080/mtm3]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">88</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670855</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638116</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">83</id>
<property name="body"><![CDATA[h1. Requirements For MOOS Science Experiment

# General Requirements
## A website like that of CIMT/MTM
## A request for calibrated salinity instead of conductivity was made.
## A general comment was made how we should have something in place to notify data users that they need to acknowledge MBARI if data is used.
## Make sure ITD is OK with sharing images from camera and if 1 year embargo applies to that data.
# Instrument specific requirements
## MTM-4 Surface Node (*SSDS ID 1446*): There appear to be no real SSDS requirements for this.  There is no XML defined for this
### Satlantic Radiometer (*SSDS ID 1270*): This is a binary instrument that needs special processing to do anything useful with.  We have XML defined for it, but I suspect it is out of date.  The XML simply states that the DataStream is binary.
### Triaxys directional wave sensor (*SSDS ID 1286*):  This instrument has a fairly well behaved data structure. It does not appear that we have XML defined for this instrument, but we should.  I know it has been deployed and we are generating plots for it for MTM-3 which has ID of 1339.  Here is an example of a data record:
{{$WC,81,060108,1640,13.37,6000,01020,3.33,,132,0,-0.230,0.000,1.700,0.00,28.6,0.00,249,75,4308}}
### Heave Sensor (is this the Triaxys above?)
#### Unknown, assuming it will be just like plots on CIMT
### GPS (*SSDS ID 1287*): This is a standard GPS that we have been dealing with.  We have XML defined, but we need an application that user's can configure a watch circle and set an alarm that will send an email if it goes outside the circle.  Here is an example data record:
{{$GPRMC,104538,A,3648.2007,N,12147.2515,W,000.0,329.4,291105,014.8,E  * 6E}}
### ASIMET LWR (*SSDS ID 1289*): We have seen these instruments before.  We don't have any XML in CVS for it, but it seems like we should.  There might be a similar instrument on another deployment that we can take the XML from.  Here is an example of the data record 
{{294.45 294.46 11614.4 11597.3 -74.0 425.0 33284 33438 32760}}
### Radiometer, Long-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Short-wave, ASIMET (is this the same as above?)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### ASIMET HRH (*SSDS ID 1290*): Again, one we have seen before, but no XML.  We should have some elsewhere.  Here is an example data record:
{{40.634 21.746 : 38124 40892}}
### Relative Humidity - Air Temp., ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### ASIMET WND (*SSDS ID 1291*): Same, no XML, but we have instruments just like it.  Here is an example of the data:
{{0.00 0.00 0.0 0.0 0.0 147.8 333.2 -4.8 4.7}}
### Wind Speed/Direction, ASIMET (is this the same as above?)
#### Unknown, but assuming it will be like current mooring ASIMETs
### Power Can (*SSDS ID 1322*): We have XML, but we need to see if anything has changed.  A (large) example of the data (consult the data stream for more info):
{{ADC00 A+1.5209e-04 N0000600 L+1.5260e-03 H-1.2208e-03 D-3.0520e-04 E0}}
{{ADC01 A+1.8414e-04 N0000600 L+1.2208e-03 H-9.1560e-04 D-3.0520e-04 E0}}
{{ADC02 A+7.8088e-02 N0000600 L+7.3778e-02 H+8.1754e-02 D+0.0000e+00 E0}}
### Load cell 0-10,000 lbs. version A (Bridle)
#### Unknown, assuming it will be just like plots on CIMT
### P2 ADC
#### Unknown, assuming it will be just like plots on CIMT
### Nitrate Analyzer, ISUS
#### Assuming that Luke will be creating (or adding to the current) ISUS page for this, we will just link to it.
### CTD (SBE 37SM)
#### Unknown
### Current Meter, ADCP, RDI Long Ranger, 600m range
#### John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
### SeaHorse Profiler (*SSDS ID 1405*): This is a binary format.  I think it is a gzipped set of data for each record, but need to chech with Andy Hamilton about it.  There is XML for it, but we just say binary.
### MBARI Medusa (*SSDS ID 1441*): There is not XML for this and I think this is a new instrument.  We have not seen any data yet, I only see:
{{ERR: Timeout;Timeout;Timeout;retry limit exceeded}}
### ASIMET BPR (*SSDS ID 1443*): There is no XML for this and the data looks like:
{{1025.42 1025.42}}
### Pressure, Barometric, ASIMET (Is this the same as above?)
#### Unknown
### MSP430 (*SSDS ID 1447*): Although this instrument does not have XML specifically, we have seen this many times before.  Data looks like 
{{$PEDATA, P1023.73, T27.63, H43.08, GFL0.00, GFH0.00, C301.46, TC0.00,   * 3688}}
### SOON/PCO2 (*SSDS ID 1448*): Plots of raw data like on CIMT.  QC Processing will run and plots of that data as well. No XML, but we have seen this instrument before.  No data coming yet, we get 
{{ERR: while preparing to sample}}
### Flourometer/Backscatter, Hobielabs HS2 (5000m)
#### Unknown
### Radiometer, Satlantic 350-800nm, Hyperspectral Es(air)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Satlantic 350-800nm, Hyperspectral Ed-w (water, downwelling)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
### Radiometer, Satlantic 350-800nm, Hyperspectral Lu-w (water, upwelling)
#### Unknown, but assuming similar to post processing done on other mooring radiometers
## MSE Axis BIN Medusa subnode 1 (*SSDS ID 1408*): This one only sends message packets, no data
### MSP430 (*SSDS ID 1411*): This is the same as the MSP430 on other nodes.
### MBARI Medusa (*SSDS ID 1441*): This has no XML and no current data, but I went back a couple days and found data that looks like: 
{{-> channel=0, temp=48.51, vcc=3.2316, txBiasI=3.9796, txPower=0.4652, rxPower=0.0717, status=0x0 channel=3, temp=51.10, vcc=3.2252, txBiasI=4.4665, txPower=0.5313, rxPower=0.1337, status=0x0}}
### Medusa  (*SSDS ID 1485*): Looks like the previous (might have actually replaced that one because it has current data).
{{-> channel=0, temp=51.69, vcc=3.2208, txBiasI=4.2839, txPower=-3.3320, rxPower=-10.6312, status=0x0 channel=3, temp=54.25, vcc=3.2142, txBiasI=4.7679, txPower=-2.7678, rxPower=-8.7681, status=0x0}}
### Digital Camera
#### Thumbnail page of all images from the camera (click on image to get full image)
#### Sounds like images will come back as encapsulated JPG
## CTD (SBE 16+)
#### Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
    1. MSE Axis BIN Medusa subnode 2 ('''SSDS ID 1409'''): Again, just message packets.
      1. MSP430 ('''SSDS ID 1413'''): Again, another MSP. Nothing new and has current data.
      1. MBARI Medusa ('''SSDS ID 1442'''): No current data, but recent data looks like {{{
-> channel=3, temp=49.40, vcc=3.2308, txBiasI=2.6144, txPower=0.5348, rxPower=0.2863, status=0x0
}}}
      1. Medusa ('''SSDS ID 1486'''):{{{
-> channel=3, temp=50.25, vcc=3.2476, txBiasI=2.6434, txPower=-2.6995, rxPower=-5.3036, status=0x0
}}}
      1. Digital Camera
        1. Thumbnail page of all images from the camera (click on image to get full image)
        1. Sounds like images will come back as encapsulated JPG
      1. CTD (SBE 16+)
        1. Plot raw data like on CIMT
        1. Process data to calculate salinity
        1. Plot salinity along with raw
      1. Current Meter, ADCP, RDI Sentinel
        1. John R thought the processing would be very similar to the ADCP's we have seen on MTM and M0.
      1. Current Meter, profiling, Aquadaopp HR Profiler, 6000m
        1. This is a complicated vector plot that will be calculated by matlab script.  Assume we will just display the image
      1. Flourometer/Backscatter, Wetlabs ECO BB2F triplett
        1. Unknown, but assuming this would be a similar process that Reiko is running for M0
      1. Oxygen, Aanderaa
        1. Unknown
      1. Turbidity, Nephalometer, C-star, 6000m
        1. Unknown
      1. Vertical Profiler, McLane(FSI velocity, Seapoint OBS, Wetlabs FL, CT&P)
        1. Unknown
    1. Sediment Trap, Honjo
      1. Unknown
    1. Sediment Trap, IRS
      1. Unknown
  1. Outstanding Issues:
    1. Instrument questions:
      1. ASIMET LWR (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Radiometer, short-wave (John Ryan): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Relative Humidity and Temperature (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. ASIMET Wind Speed Direction (Francisco Chavez): Is there any post processing of the raw data and if so, what does it consist of?
      1. Power Can (Ed Mellinger): Any new features/graphs
      1. Load Cell(Lance McBride): Any processing, any new plots?
      1. Seahorse(Andy Hamilton): Any processing, feedback or data plots from seahorse?  Any linked images?  Do you want processing and products tracked?
      1. MBARI Medusa(Mark Chaffey): Do we want plots of any of this data?  Any post processing (and resubmit/track)?
      1. ASIMET Barometric(Chavez or Ryan): Do plots of raw data make sense?  Any post processing (and resubmit/track)?
      1. All Satlantic Hyperspectral Radiometers (Chavez/Ryan): What/who is going to do the post processing.  What does it look like and can we feedback/link to the results.
      1. Digital Camera (Jim Barry, Mark Chaffey): is still an unknown as to what will be returned to SSDS.  Mark sent request to Jim B for requirements from the camera and that will help answer the questions for SSDS.
      1. CTD (SBE 16+) (Bill Ussler/Doug Conlin): Seabird software was identified as possibly doing the post processing, need to understand process in detail
      1. ADCP RDI Sentinel (Coenen): What is the post processing for this instrument?  Can we feedback/link data products?
      1. Aquadopp (Ussler): Contact Leslie to get post processing software.
      1. Wetlabs ECO BB2F Triplett (Ussler): Follow up to try and get example data to figure out what next steps are
      1. Aanderaa Oxygen (Barry): Need to follow up to see what the data looks like and what post processing will be done.
      1. Nephalomter (Ussler): Get details on post processing. Is this a SIAM instrument?
      1. McLane Profiler(Hamilton): Get any details on post processing and if it is to link back to SSDS.
      1. Sediment Traps(Chavez): What will the data look like, are we going to put that in SSDS?
    1. General Issues:
    1. No decision has been made on MBARI's data policy for this experiment, currently the SSDS team is assuming all data will be open. The public access to data issue was discussed and the next step is to have the scientist's meet to come up with idea of how MSE data should be accessed by the public (if at all) and then give that feedback to the MT for review/approval (note the current default is that data that goes into SSDS is public)
    1. Documentation in spreadsheet incomplete -- we need to go to each of the reps and collect this data
      1. Don't know driver writers for many nominally SIAM instruments
    1. Not sure what the summary/snapshot data (ADCP, OCR, Nortek, Weblabs) will look like and if we are supposed to do anything with it.

== Related Data Management Systems and Projects ==
  1. [http://www.openioos.org/index.html OpenIOOS.org]
  1. [http://www.geongrid.org GEON]
  1. [https://www.earthsystemgrid.org Earth Systems Grid]
  1. [http://oceanexplorer.noaa.gov/ NOAA's OceanExplorer]
  1. [http://www.gomoos.org/ GOMOOS]
  1. [http://www.seamaven.org/sm.swf SeaMaven]
  1. [http://seacoos.org/ SEACOOS]
  1. [http://www.thecoolroom.org/ The COOL Room]
  1. [http://earthobservations.org/ EARTH Observations]
  1. [http://strategies.org/ Strategies.org]
  1. [http://www.epic.noaa.gov/epic/software/dapper/ DAPPER (Look at DAPPER to serve SSDS data)]
  1. [http://www.pacoos.org/ PACOOS]
  1. [http://www.cencoos.org/ CENCOOS]
  1. [http://egy.org/ EGY]
  1. [http://www.oceansites.org/OceanSITES/ OceanSITES]
  1. [http://ingrid.ldgo.columbia.edu/ LDGO]
  1. Christoph Waldman (University of Bremen, Germany) (presented at MBARI on Jan 9, 2006)
    1. Sensor interoperability and standardisation
    1. ESONET I and ESONET II + ESONIM, KM2NET, ANTARES, ORION
    1. He is working on standardized data quality and semantics
    1. Quality Control: important to always state accuracy
    1. Using SensorML to describe the sensor and data from sensor (but does not address semantics)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">85</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670858</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638119</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">84</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|ProjectMemosMinutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]

JIRA Issue Summary:
{jiraissues:url=http://oceana:8082/secure/IssueNavigator.jspa?view=rss&&pid=10000&sorter/field=issuekey&sorter/order=DESC&tempMax=25&reset=true&decorator=none&os_username=everyone&os_password=guest|columns=type;key;summary;priority;status;created;updated}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">86</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670857</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638118</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">90</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.

## MBARI Examples
### [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced expd]
### [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
### [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
### [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
### [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
### [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out.

=== External Oceanography Examples ===

 * [http://seacoos.org/Data%20Access%20and%20Mapping/ SeaCOOS] typical IOOS Regional Association site
 * [http://nautilus.baruch.sc.edu/carocoops_website/index.php CaroCOOPS] nice display of mooring sites

=== External General Examples ===

 * [http://maps.google.com Google Maps] points overlaid on lat/long (2 dimensions]
 * [http://earth.google.com Google Earth] latest cool view of the world (2 1/2 dimensions)

== Data Visualization ==

This section addresses interfaces for viewing the data.

=== Overview ===

 * [http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf Oceanographic Visualization Overview] White paper (PDF) of visualization techniques and examples.

=== Workflow/Automated ===

 * [http://kepler-project.org/ Kepler project] Project that can automate science data workflows, including visualizations]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">92</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">87</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

# [Requirements|ProjectRequirements]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">89</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">88</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

h5. Requirements

# [Requirements|ProjectRequirements]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">90</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670853</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638114</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268933</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

h4. A. Initial look at the data

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}\\

h4. B. Tips for debugging with Ferret

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}\\

h4. C. Fixing the start times for all the child instrument deployments

The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

h4. D. Examining the gridding method

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.

h4. E. Testing the results of the gridding

It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0040_20101027_original.nc"
plot/symbol=1 temperature[d=3]
plot/ov SEA_WATER_TEMPERATURE_HR[k=4,d=1]

{noformat}
Gives:

 !m1_compare_20.gif|thumbnail!

 !m1_compare_40.gif|thumbnail!

We obviously still have some gridding issues...

h4. F. Rinse and repeat


Now is the time to iterate using our method of starting with the .jnl file that aggregates and grids the data to the OceanSITES \_TS.nc file going back to step D.
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236169</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388843</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356086</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388844</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|Analyzing signals from MARS using SSDS and Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356087</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388845</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356088</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388835</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.  For MetadataPackets, the packetType ends up being 1.  For SensorDataPackets, the packetType ends up as 0.  For DeviceMessagePackets, the packetType is 4.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

Ingest Packet Structure

Lets look at the structure of the packets that are coming into the Ingest component as this is what SSDS is natively expecting. Clients communicate with Message Driven Beans via Java Messaging Service (JMS) and send data in JMS Bytes Messages. These are basically JMS messages with a binary blob in the payload. When Ingest receives one of these messages, it attempts to deconstruct the message into the following structure:

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte[bufferLen])|bufferTwoLen (int)|bufferTwoBytes (byte[bufferTwoLen])|

|deviceID (long)|This is what is known as the SSDS ID for the device that actually generated the packet of information.|
|parentID (long)|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.
|packetType (int)|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356078</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388837</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.  For MetadataPackets, the packetType ends up being 1.  For SensorDataPackets, the packetType ends up as 0.  For DeviceMessagePackets, the packetType is 4.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356080</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388839</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType (long)|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|dataDescriptionID (long)| |
|dataDescriptionVersion (long)| |
|timestampSeconds (long)| |
|timestampNanoseconds (long)| |
|sequenceNumber (long)| |
|bufferLen (int)| |
|bufferBytes (byte[bufferLen])| |
|bufferTwoLen (int)| |
|bufferTwoBytes (byte[bufferTwoLen])| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356082</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388841</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Metadata Packet
1 = Data Packet
2 = Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

SQLIngest Packet Structure

After the Ingest JMS processes the message (stores it to a local file), it then forward the message on to another topic so that it can be stored in a SQL database. The message structure the SQLIngest Message Driven Bean is expecting is exactly the same as that of the Ingest Message Driven Bean.

|deviceID (long)|parentID (long)|packetType (int)|packetSubType (long)|dataDescriptionID (long)|dataDescriptionVersion (long)|timestampSeconds (long)|timestampNanoseconds (long)|sequenceNumber (long)|bufferLen (int)|bufferBytes (byte\[bufferLen\])|bufferTwoLen (int)|bufferTwoBytes (byte\[bufferTwoLen\])|

The ultimate format of the data that goes into SSDS is defined by the data storage mechanism which is a relational database.  The database table is named after the SSDS ID of the device it is related to and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

h5. Data Packet Structure

In the SSDS world, our concepts
h5. Transmogrify Component
The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process.  The first step is the Transmogrify service.  This service configuration is shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

Java clients use a jar file that contains the JBossMQ client utilities and then publishes messages to the Transmogrify message topic.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356084</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16449621</id>
<property name="body"><![CDATA[||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16416858</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388623</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
!Figure 1.jpg|align=centre!]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355897</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268800</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!
(lots of other output skipped)
SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236034</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388624</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
!Figure 1.jpg|align=centre!

You are looking for the *DeviceQCPlotConfig* table and if you scroll down and right-click on it, then choose 'Open Table->Return all Rows' you will see the listing of all the configurations for creating plots (Figure 2).
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355898</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268801</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236035</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388631</id>
<property name="body"><![CDATA[The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process as shown here:]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355864</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388626</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
!Figure 1.jpg|align=centre!

You are looking for the *DeviceQCPlotConfig* table and if you scroll down and right-click on it, then choose 'Open Table->Return all Rows' you will see the listing of all the configurations for creating plots (Figure 2).
!Figure 2.jpg|align=centre!

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355900</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5865699</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reason (security for the SSL case).  These instructions were performed on a Solaris installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Subversion (TODO: kgomes, more information here when we get open source repository configured).
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5832941</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268796</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data
# Executed the temporary truncated file from a Ferret session

{noformat}
{noformat}

 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236030</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388620</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355894</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16449623</id>
<property name="body"><![CDATA[||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data


And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16416860</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388627</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| |
|.| |
|.| |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355860</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388621</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355895</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268798</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!
(lots of other output skipped)
SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the input and output time axes:

{noformat}

{noformat}


 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236032</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16449624</id>
<property name="body"><![CDATA[{note:title=This doc has been moved}
Most of the documentation for SSDS should be on the Google code site now and this page is here:
[http://code.google.com/p/shore-side-data-system/wiki/TransmogrifyAndIngest?ts=1300464544&updated=TransmogrifyAndIngest]
{note}

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data


And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16416861</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388628</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355861</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268792</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row.&nbsp; Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for dagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page

 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236026</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388617</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355891</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268794</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page

 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236028</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268788</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row.&nbsp; Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  

 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236022</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268790</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row.&nbsp; Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for dagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log

 ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236024</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268783</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.  

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}

The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data from file ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236017</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3178563</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]
# [Tasks]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana.shore.mbari.org:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3113031</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268786</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [SPEPRJ:Installing RabbitMQ (AMQP) on RHEL5]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236020</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268785</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.  

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}

The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the [TS: ] row.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236019</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268779</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page (http://www.mbari.org/oasis/qc/index.html) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.  Here's an example of doing this:

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236013</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388638</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Ingest Deployment]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355912</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268781</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.  Here's an example of doing this:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="28-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 72 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 28-MAY-2011 04:30 / 5097:  11.55   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 05:30 / 5098:  11.50   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 06:30 / 5099:  11.48   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 07:30 / 5100:  11.44   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 08:30 / 5101:  11.41   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 09:30 / 5102:  11.36   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 10:30 / 5103:  11.36   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 11:30 / 5104:  11.52   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 12:30 / 5105:  11.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 13:30 / 5106:  11.82   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 14:30 / 5107:  11.80   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 15:30 / 5108:  11.85   ....   ....  10.14   9.31   8.95   8.77   8.28   8.03   7.69   7.55
 28-MAY-2011 16:30 / 5109:  12.01   ....   ....   9.78   9.42   8.94   8.77   8.29   8.08   7.65   7.55
 28-MAY-2011 17:30 / 5110:  12.04   ....   ....   9.71   9.25   8.94   8.80   8.33   8.09   7.69   7.53
 28-MAY-2011 18:30 / 5111:  12.24   ....   ....   9.74   9.27   8.92   8.81   8.37   8.09   7.73   7.47
 28-MAY-2011 19:30 / 5112:  12.37   ....   ....   9.83   9.31   8.92   8.81   8.26   8.08   7.71   7.49
 28-MAY-2011 20:30 / 5113:  12.44   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 21:30 / 5114:  12.57   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 22:30 / 5115:  12.19   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-MAY-2011 23:30 / 5116:  12.09   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 00:30 / 5117:  12.07   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 01:30 / 5118:  12.12   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 02:30 / 5119:  12.11   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 03:30 / 5120:  12.15   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 04:30 / 5121:  12.11   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 05:30 / 5122:  11.82   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 06:30 / 5123:  11.75   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 07:30 / 5124:  11.70   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 08:30 / 5125:  11.63   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 09:30 / 5126:  11.58   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 10:30 / 5127:  11.53   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 11:30 / 5128:  11.47   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 29-MAY-2011 12:30 / 5129:  11.44   ....   ....   9.54   9.15   8.97   8.71   8.27   8.02   7.80   7.54
 29-MAY-2011 13:30 / 5130:  11.40   ....   ....   9.49   9.17   8.81   8.50   8.23   8.01   7.78   7.51
 29-MAY-2011 14:30 / 5131:  11.37   ....   ....   9.43   9.15   8.97   8.55   8.14   7.93   7.70   7.50
 29-MAY-2011 15:30 / 5132:  11.36   ....   ....   9.35   9.19   8.97   8.64   8.20   7.91   7.66   7.50
 29-MAY-2011 16:30 / 5133:  11.35   ....   ....   9.52   9.21   8.97   8.73   8.23   7.91   7.66   7.53
 29-MAY-2011 17:30 / 5134:  11.37   ....   ....   9.56   9.16   9.04   8.79   8.22   7.91   7.70   7.50
 29-MAY-2011 18:30 / 5135:  11.38   ....   ....   9.58   9.28   9.07   8.77   8.23   7.98   7.71   7.52
 29-MAY-2011 19:30 / 5136:  11.36   ....   ....   9.65   9.27   9.01   8.73   8.25   8.02   7.67   7.47
 29-MAY-2011 20:30 / 5137:  11.36   ....   ....   9.60   9.25   9.00   8.70   8.26   8.03   7.75   7.54
 29-MAY-2011 21:30 / 5138:  11.35   ....   ....   9.58   9.27   8.95   8.70   8.25   8.02   7.80   7.56
 29-MAY-2011 22:30 / 5139:  11.37   ....   ....   9.59   9.01   8.81   8.65   8.19   8.00   7.71   7.56
 29-MAY-2011 23:30 / 5140:  11.38   ....   ....   9.52   9.11   8.87   8.64   8.19   8.02   7.76   7.53
 30-MAY-2011 00:30 / 5141:  11.34   ....   ....   9.53   9.28   8.97   8.64   8.18   8.03   7.79   7.51
 30-MAY-2011 01:30 / 5142:  11.20   ....   ....   9.50   9.20   8.94   8.63   8.16   8.04   7.81   7.55
 30-MAY-2011 02:30 / 5143:  10.99   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 03:30 / 5144:  10.89   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   .... 
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236015</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388637</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Ingest Deployment]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355911</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388626</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of seconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of seconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest Packet Timestamp|Date/Time|Date and time of latest packets|

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355859</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268775</id>
<property name="body"><![CDATA[h2. Debugging Quick Look and contour wind stick plots

The quick look plots on the public Oasis data page (http://www.mbari.org/oasis/qc/index.html) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the current_qcPlots.html web page produced for each mooring that is processed.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236009</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388624</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355857</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268777</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page (http://www.mbari.org/oasis/qc/index.html) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.py) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_utils.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236011</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388628</id>
<property name="body"><![CDATA[This page documents how to configure SSDS to generate batch plots of various data that is tracked in the Shore Side Data System. The batch process runs every hour so keep that in mind as you configure your plots.  It is on our plate to develop a nice web front end to this configuration, but for now, you will have to brute force it through the database itself.  The information you will need to know ahead of time is:
# The SSDS ID of the instrument you want to create plots for.
# The variable names (exactly!) that you want plotted
# The length of times you want the plots to go back (this software gives you the option to choose the number of hours back and uses that to plot the data).
# The titles you want listed on your plot

Now, in order to get to the table in the database, you will need to be on the MBARI network and have access to the Enterprise Manager software from Microsoft.  That is what is used to connect to the database where this configuration is kept.  You will also need an account that you can use to connect to the database with that has permissions to edit the table (check with the SSDS guys for this).  So, first start up Enterprise Manager in windows. Once you have started it, there should be a group called 'SQL Server Group'.  If you right click on that, you can register a connection to a database server by selecting "New SQL Server Registration".  A wizard will walk you through the registration process and you want to connect to the server solstice.shore.mbari.org using the name and password from the SSDS guys.

Once you have registered the server, you can open the 'plus' sign next to it to dive down to the database of interest: SOLSTICE.SHORE.MBARI.ORG->Databases->SSDS_Data->Tables and you should see something like this:
!Figure 1.jpg|align=centre!

You are looking for the *DeviceQCPlotConfig* table and if you scroll down and right-click on it, then choose 'Open Table->Return all Rows' you will see the listing of all the configurations for creating plots (Figure 2).
!Figure 2.jpg|align=centre!

Here is a list of the columns and what they mean:
* DeviceID_FK
* PacketSubType
* RecordVariable_Name
* NumberOfHoursBack
* Chart_Type
* X_Size
* Y_Size
* X_Axis_Label
* Y_Axis_Label
* Title
* Page_Title
* Page_URL_String
* Image_URL_String
* Data_Page_URL_String
* Y_Max
* Y_Min
* Y_Axis_One_Or_Two
* Use_Long_Variable_Name
* Gps_Show_Anchor
* Gps_Anchor_Latitude
* Gps_Show_Watch_Circle
* Gps_Watch_Circle_Diameter_Km
* Gps_Scale_Chart_To_Fit_Data
* GraphOn
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355902</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268773</id>
<property name="body"><![CDATA[h2. Debugging Quick Look and contour wind stick plots

The quick look plots on the public Oasis data page (http://www.mbari.org/oasis/qc/index.html) are created by the SSDS-driven Netcdf processing that runs on elvis every 2 hours DStoNetCDF.pl&nbsp; ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236007</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388659</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355892</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388661</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# Analyzing signals from SSDS using Matlab]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355896</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5865697</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reason (security for the SSL case).  These instructions were performed on a Solaris installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Subversion (TODO: kgomes, more information here when we get open source repository configured.
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5832939</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5865695</id>
<property name="body"><![CDATA[h5. SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

h5. Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]

h5. Tasks
# [Tasks]

h5. Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

h5. Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5832937</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5865694</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reason (security for the SSL case).  These instructions were performed on a Solaris installation,
but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Subversion (TODO: kgomes, more information here when we get open source repository configured.
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
#Download Jboss distribution
#Unzip to an installation location
#Copy custom.properties.template to custom.properties and edit
#Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
#Using mySQL command utility, run the MySQL script to setup DB
#Start JBoss
#Configure mod_jk in Apache/JBoss
#Configure SSL for login.jsp page
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5832936</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388652</id>
<property name="body"><![CDATA[The SSDS is a J2EE application that uses Java Messaging Service (JMS) to ingest data and metadata from clients.  There are multiple stages of the ingest process as shown here:
{gliffy:name=SSDS JMS|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355885</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268864</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret commands will show the input data compared to the gridded data:
&nbsp;
&nbsp;]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236100</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268866</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for perming mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret commands will show the input data compared to the gridded data:

{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236102</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268852</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding, say @AVE, for the hourly data from 40m and below.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236087</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268854</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure: !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.
&nbsp;
It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret commands will show the input data compared to the gridded data:
&nbsp;
&nbsp;]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236089</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268844</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62  
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19     

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300    
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes? 

{noformat}

O.K.!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236079</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268846</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62  
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19     

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300    
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes? 

{noformat}

O.K.!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the _TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:

{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236081</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268848</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62  
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19     

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300    
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes? 

{noformat}

O.K.!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the _TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:

{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}


Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:

{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236083</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268850</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}
To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}
The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the standard operating procedure for perming mooring turns. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236085</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268838</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62  
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19     

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300    
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes? 

{noformat}

O.K.!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236073</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10388736</id>
<property name="body"><![CDATA[This page describes how you might configure a web application to consume the graphs that are generated by the SSDS.  The way this example is done is by using the Eclipse Java EE Edition to create a web application that allows the user to author pages and deploy them to an application server like Tomcat.

h3. Install Servlet Container
The first thing to do is install a servlet container where your web application will be deployed.  This is most often Tomcat, but can also be something that utilizes Tomcat internally (like JBoss).  For this example, we will download and use JBoss 4.0.3SP1 which utilized Tomcat 5.5.

# Download JBoss from here [http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.0.3SP1/]
# Unpack the download to where you want to install it, open a command window, and change to the directory where you unpacked the download (where you installed it).
# Start the JBoss server by running run(.sh for Unix and .bat for Windows). Assuming now errors fly by and you get the 'server started in ...' message at the end, Jboss installed successfully.  You can use Cntl-C to stop the server.
# Now download Eclipse JEE 3.5 from here [http://eclipse.org/downloads/] and install it.
# Startup Eclipse after you install it.
# Go to the Workbench view so we can configure a server which will connect to your JBoss installation.
# Click on 'File->New->Other...' and then select 'Server->Server'. Then 'Next>'
# Then select 'JBoss->JBoss 4.0'.  The default server host of 'localhost' and server name of 'JBoss v4.0 on localhost' is fine. Click on 'Next>'.
# You can use the Default JRE and for the 'Application Server Directory' browse to the location where you unpacked JBoss.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356010</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268804</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62  
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19     

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300    
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes? 

{noformat}

O.K.!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236038</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17268803</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W   
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:

# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED

To follow through with this example of gappy data I took these steps:

# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL, 
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes? 
{noformat}

This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:

# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:

{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W   
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W   
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875
 
       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}


 The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17236037</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388717</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from SSDS using Matlab|SSDS:Analyzing signals from SSDS using Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8355953</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">25428137</id>
<property name="body"><![CDATA[This page documents the progress and status of Benthic Rover data management activities, as of the end of July, 2009.

h1. Overview: Status of Benthic Rover Data Mgt Tasks

Right now Rover data is being copied (manually?) to shore.  The intent is to have it all logged to SSDS.  The proposal for doing so was previously circulated to the Rover team, and has a lot of detail that may be of interest, though some information is out of date.

The Rover data is stored in the project share for the Rover (900502.BenthicRover), under Rover.Deployment.  This is not an ideal place for data; the permissions have to be set correctly to avoid accidentally losing the data, and I believe it can not be exposed for easy access via the web.  The project may wish to consider moving it to a more accessible share, similar to the BIAUV share.

There are several tasks for Rover data management.  The tasks and their status are as follows.

h3. Convert most recent Rover data to new format

Some time ago we designed a new data format (changing both organization of files, and content for the data files). Past Rover data of value (through last October, the last pre-MARS mission) were converted to the new format. This data is stored under Rover.Documents/Project.Data/ReprocessedData/RoverData_2007-2008_NewFormat.

The Rover began collecting data again several weeks ago, when it was attached to the MARS node.  That data is being uploaded to the Rover Project Folder on Tornado. It appears the current release of the Rover software writes data in this format. (nice, Rich!)  See Converting Rover Data Formats below for more information.

h3. Logging Rover data in SSDS

No Rover data is being logged to SSDS; this task is in progress as described below.

Originally the notion was to log Rover data in real time.  Since the Rover will only be on MARS for a brief period, we no longer intend to do this, but will log all data retroactively instead. 

h3. Logging Rover images to SSDS

This task has not started. The approaches being considered are described below.

h1. Converting Rover Data Formats

This task established a 'normalized' data file format, in which each mission (e.g., a cruise), deployment (when Rover is physically deployed off a ship, or spends a period of time doing a science or engineering project), plan (script or similar set of commands), or activity (something producing data from a particular device) had its own folder.  Folder names indicate the type of folder, the sequence of the folder among others at the same level, and whatever identifier the original user wanted for that mission, deployment, plan, or activity. This provides an order and hierarchy for the data, and puts different kinds of data into different folders.

Each data file also has a standard format in the normalized scheme, making fields like timestamp the same for all Rover files.

The organization and renaming of files from the old format to the new format was performed manually, and only for those missions that appeared to have any data of interest that could be converted. The reformatting of records was done automatically via the formatDataFiles.pl script (checked in to svn:rover/trunk/scripts/perl/). This script leaves filenames in an intermediate state; the user must then run undoFormatFiles.pl (in the same directory; has a terribly misleading name) to either finalize or revoke the changes. Not ideal, but I don't know that you'll have to run this code ever again.

It appears the MARS Roverdeployment is writing missions largely in the new format (yay!).  Only the system log and optode file formats could be confirmed; currents data was not evident yet.  Metadata about device IDs is missing from the first line of the data files; either this will need to be corrected, or the processing software will need to know what to use for a device ID when none is present.

There are some minor differences between the proposed directory layout and the new layout (most of these can be addressed trivially), and some new files are present that may require additional code to submit.

h1. Submitting Rover Data to SSDS

The strategy for submitting Rover data was to submit it record by record to the SSDS system, associating the records with the corresponding device IDs using the XML at the top of the file. Metadata will be collected from the folder names, and submitted separately to SSDS. The hierarchy of the folders can be preserved in SSDS by making each folder a deployment in SSDS, thus allowing similar navigation within SSDS.

(We considered submitting all the original files of Rover data to SSDS, the way the AUVs do.  I considered the files more of a transport mechanism, and also wanted to support real-time submission at some point, so this is not the current mechanism.)

So far we have successfully validated submitting individual test records to SSDS (not Rover test records, but the difference should be trivial).  And I have a Perl script checked in, roverParse.pl, that can either submit records to SSDS, or log them to a file; this appeared to be working (logging to a file) when run against the reformatted data. All that would be required to submit the data to SSDS is setting a flag to submit data into the SSDS server, instead of logging it (recommend running against a test server first though, especially if you wanted to run it on the new MARS data, as it hasn't had much testing).  

I have some notional changes on where to fit metadata management into that script.  Some Perl was written to parse folder names, but it is in a very preliminary state.  And I started to verify the metadata submission process using SSDS testing utilities, but there were challenges I haven't overcome.  All this work was continuing up until my departure. 

The next steps will be to (a) try parsing and submitting all the metadata information; (b) try submitting all the data records (hmm, might be better/faster to do this first?) (c) connect the data to the metadata, or vice versa. Since data goes into SSDS buckets according to the device that generated it, it will be important for the processing scripts to either know, or have a way to determine, those device IDs. (Paul McGill keeps a spreadsheet as current as he can that contains this information; make sure he updates the one that I added a sheet to, as it has a more thorough description of device IDs on all the deployments.)

The data records were most important data elements, but more data files appear to be in the data sets now (not sure which of the additional files are generated on the Rover).  A decision will have to be made about which of these should be submitted to the SSDS. The team may also prefer to keep processed data separate from the original data, to avoid confusion.

h1. Submitting Rover Images to SSDS

The Rover collects images from multiple cameras.  Some of these are JPEG images, and some are RAW (Bayer) images.  The intent was to either submit the images to SSDS directly, or store them in an accessible place and index them in SSDS.  Unlike the [BIAUV:BIAUV Image Processing Strategy] situation, there are relatively few images for the Rover, so storing them directly in SSDS is not out of the question.

The exact technique for storing images was still being investigated, and the metadata for the images needs consideration.

h3. Conversion of images

The RAW images must be converted to JPEG or other suitable format.  Whether this is done before or after storing the images is at the discretion of the program, given the disk space required/available.  Although no Unix script existed to do this when last investigated (in 2008), one may be available now.

h3. Metadata for images

The image metadata in the raw images is entirely non-existent. There is not even a timestamp.  Fortunately timestamps are maintained in the name of the image, but this is a very weak metadata system for such a critical piece of information.

The plan and recommendation is to follow similar image metadata post-processing as is performed for the Benthic Imaging AUV images ([BIAUV:BIAUV Image Processing Strategy]).  Much of the same code could be reused, but the metadata will have to come from different places or analysis.  (The fastest way to do this may be to generate netCDF files for the Rover data sets, as this could probably be done readily.  Then much of the BIAUV processing could apply more directly.)  Rover position should be assumed at first to be the same as the MARS node, with a large error bar of course.

The most fundamental and important modification to add metadata for images will be the timestamp, as all knowledge of the image depends on correct timestamps, and putting that metadata in the name is very weak, as noted previously.

h3. Image storing technique

As discussed in the [BIAUV:BIAUV Image Processing Strategy], it is not clear whether images should be stored directly in SSDS at all. Kevin Gomes and I were interested in trying this out to see how well it could work, snd I did a bit of work on Rover with it. It might be advantageous to use the same method as the BIAUV; the team may want to read that document before deciding on an approach.  The detailed organization of the Rover data products, where images are in many different sub-sub-directories, may be a factor.

The first attempt to store images was via hex-encoded URLs (HTTP GET), but this failed due to the length (MBs!) of the URL.

A second suggestion, not yet tried, was submitting images via HTTP POST.  

It is also possible to directly submit images via a Java interface. This is awkward with the Perl scripts, but a Java tool might do so readily.

Finally, it is possible to just store the images on an appropriately accessible share, and index them in the SSDS metadata.

h1. XML and XSLT Files

Rich Henthorn and John Graybeal spent some time figuring out how to embed descriptions of the Rover deployed instrumentation in (a) an on-board description file or directory, and (b) the data logs of a mission. The notion we came up with was to document all the devices in XML files that are on board, and create a single master XML configuration file that points to the appropriate XML files (using XPath and XPointer).  In addition, the first line of data files could contain a minimal XML segment containing the device IDs; this would be written by the device driver, and is needed for post-processing to submit the data records into appropriate device bins.

I'm not sure how much of those concepts are in the Rover mission code, nor how much will be added later.  The XML files have been written and are checked in at svn:rover/trunk/xml and the RoverConfiguration subdirectory.

The Rover configurations can be described in a nice format using the XML files and nice XSLT transforms to convert the XML information into web pages.  Three XSLT files, to transform the XML into descriptions or checklists of the Rover configuration, can be found at svn:rover/trunk/scripts/xsl. Example outputs are also there. See the README file for details.  

These transformations can be run on the Rover itself using (for example) xalan or similar UNIX-generic XSL transformation software, but this environment has not been set up on the Rover, to my knowledge.  (Note Oxygen's xsltproc does not correctly handle the XPath/XPointer, and so will not work; you must set the XSLT processor as part of the Transformation configuration settings.)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">25395369</id>
</property>
</object>
<object class="SpaceDescription" package="com.atlassian.confluence.spaces">
<id name="id">4456499</id>
<property name="title"/><collection name="bodyContents"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">4489265</id>
</element>
</collection>
<property name="version">2</property>
<property name="creatorName"><![CDATA[kgomes]]></property>
<property name="creationDate">2006-10-17 21:39:33.420</property>
<property name="lastModifierName"><![CDATA[kgomes]]></property>
<property name="lastModificationDate">2006-10-18 08:17:38.940</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">9</id>
</property>
<property name="contentStatus"><![CDATA[current]]></property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798888</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS (which can take up to 5 minutes after the OASIS2SSDS has completed), the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct (also compare sequence number in query return and the raw data page), copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766124</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798884</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS, the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct, copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766120</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798886</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS (which can take up to 5 minutes after the OASIS2SSDS has completed), the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct, copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766122</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798882</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the correct device ID and the correct XML file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS, the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct, copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766118</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798880</id>
<property name="body"><![CDATA[{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}
This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766116</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798878</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766114</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798877</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looke at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  For SSDS, that would look something like this:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766113</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798863</id>
<property name="body"><![CDATA[{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=M}
This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looke at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  For SSDS, that would look something like this:

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766099</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798859</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looke at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  For SSDS, that would look something like this:

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766095</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">7798858</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# 

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">7766094</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388871</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://localhost:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=String&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=String&p3Value=10
&p4Type=Boolean&p4Value=false
&p5Type=String&p5Value=0
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356114</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388873</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time windows over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfPoints is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://localhost:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=String&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=String&p3Value=10
&p4Type=Boolean&p4Value=false
&p5Type=String&p5Value=0
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356116</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670677</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637927</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663510</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
# [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
# 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630753</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663512</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
# [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
# 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630755</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670680</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.
[Diagram of MBARI's SSDS Before Application Consolidation|^Before Cleanup Deployment.jpg|Before Application Consolidation]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637930</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663514</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
# SSDS Specific
## [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
# [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
# 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630757</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663515</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
# SSDS Specific
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630758</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670685</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note: Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637936</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663518</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf]
# SSDS Specific
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630761</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670683</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637934</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663520</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
# SSDS Specific
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630763</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388892</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Ingest Deployment]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|Analyzing signals from MARS using SSDS and Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356136</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670689</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note: Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637940</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670687</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note: Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637938</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670691</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note: Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637942</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388905</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# [Ingest Architecture]
# [Ingest Deployment]
# [Services]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|Analyzing signals from MARS using SSDS and Matlab]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356152</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670693</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637944</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670695</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org and make sure nothing new is using predator.
## Verify all DODS urls are accessible through dods.mbari.org
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637946</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670698</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataContainerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637949</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388914</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script ssdsSubmit.pl to publish download statistics records to SSDS:
&nbsp;
{code}
 # Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356161</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388913</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# Incorporate this class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356160</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663532</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
# SSDS Specific
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630775</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663538</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Presentations
# 
h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630781</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663536</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific

## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630779</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388916</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356163</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663553</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Presentations
# [2001 Standard Metadata and Data Formats|^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630796</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663560</id>
<property name="body"><![CDATA[h3. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])
----
h3. Notes and memos
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Presentations
# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630803</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663562</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Presentations
# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630805</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663561</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

h3. Notes and memos
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Presentations
# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630804</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663555</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Notes and memos

h5. Presentations
# [2001 Standard Metadata and Data Formats|^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630798</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663558</id>
<property name="body"><![CDATA[h3. SSDS Project Documentation

h5. Abstracts and Proposals
# MOOS Project
## [2001 MOOS Project Proposal|^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Notes and memos
# [2002-03-14 SSDS ISI Interface Meeting Notes|^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Presentations
# [2001 Standard Metadata and Data Formats|^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630801</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663557</id>
<property name="body"><![CDATA[h5. SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

h5. Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]

h5. Tasks
# [Tasks] *Deprecated, see Project Documentation*

h5. Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

h5. Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|https://oceana.mbari.org/jira/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630800</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663568</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630811</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670735</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataContainerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637988</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663569</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630812</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663564</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

h5. Presentations
# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630807</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15663566</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.

----

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15630809</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670742</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637995</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670739</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3637992</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670754</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638007</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670752</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638005</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670750</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638003</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670759</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638012</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388965</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://localhost:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=String&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356217</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8388964</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: TIME_ONLY_GAP, SEQ_ONLY_GAP,
                                        // TIME_SEQ_GAP
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // SERVICE_CALCULATED or USER_SPECIFIED
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://localhost:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=String&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=String&p3Value=10
&p4Type=Boolean&p4Value=false
&p5Type=String&p5Value=0
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8356216</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670761</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638014</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670755</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638008</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670757</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should be able to move cimt.war to new-ssds and then have all ssdspub.mbari.org forwarded to the new-ssds.  That way, we could remove ssdspub.
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator.  All of the services and such are all pointing to the old metadata database SSDS, so those can be removed.
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org?  In order to do that, I need to:
## Change all references to predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure nothing new is using predator.
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638010</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670767</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything

## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638020</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670769</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}

## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638022</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670763</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### In order to do this, I have to run a search and replace SQL to find and replace predator.shore.mbari.org with ssds.shore.mbari.org on all uriString attributes of DataContainer.  This is done with this SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, for that, I am just going to remap the others using:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638016</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670765</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that,
And then remove the others.  So to check to see if those resources are associated with anything, you can run something like the following on all the 'AssocResource' tables
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
If any associations are found, you can remove them using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
### Now for Software:
{noformat}
UPDATE ssdsdba.Software set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638018</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670776</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them, I am just going to let them be and have broken links (for now).
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638029</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670784</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
If you look at the attached image, you can see that for DODS urls:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/
{noformat}
is equivalent (points to the same location as):
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/
{noformat}
So the following SQL should update records that point to the ssds.shore DODS server and change them to point to the dods.mbari.org one:
{noformat}
UPDATE ssdsdba.DataContainer set dodsUrlString = REPLACE(dodsUrlString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where dodsUrlString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/%'
{noformat}
And now that I have done all that, there are no entries in ssdsdba.DataContainer that have dodsUrls that point to ssds.shore (I think I remember changing those awhile ago.
## Change any DODS Urls that point to ssds.shore (or predator) to point to dods.mbari.org (There are none, so we are done).
### OK, this is interesting, there are a bunch of uriString that point to the dods server on ssds.shore.  It looks like really old stuff and I think they just need to be redirected to the HTTP links where the equivalent files are:
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/','http://dods.mbari.org/cgi-bin/nph-nc/data/') where uriString like 'http://ssds.shore.mbari.org%nph%'
{noformat}
## Make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638037</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3670786</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3638039</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9405156</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the {color:#cc0000}{+}correct device ID{+}{color} *and* the {color:#cc0000}{+}correct XML{+}{color} file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS (which can take up to 5 minutes after the OASIS2SSDS has completed), the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct (also compare sequence number in query return and the raw data page), copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9372424</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">631</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006|WeeklyMeeting20060105]
# [Weekly Notes from January 12, 2006|WeeklyMeeting20060112]
# [Weekly Notes from January 26, 2006|WeeklyMeering20060126]
# [Weekly Notes from February 2, 2006|WeeklyMeeting20060202]
# [Weekly Notes from February 16, 2006|WeeklyMeeting20060216]
# [Weekly Notes from March 2, 2006|WeeklyMeeting20060302]
# [Weekly Notes from March 9, 2006|WeeklyMeeting20060309]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006|WeeklyMeeting20060323]
# [Weekly Notes from March 30, 2006|WeeklyMeeting20060330]
# [Weekly Notes from April 6, 2006|WeeklyMeeting20060406]
# [Weekly Notes from April 13, 2006|WeeklyMeeting20060413]
# [Weekly Notes from April 21, 2006|WeeklyMeeting20060421]
# [Weekly Notes from April 27, 2006|WeeklyMeeting20060427]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006|WeeklyMeeting20060518]
# [Weekly Notes from May 25, 2006|WeeklyMeeting20060525]
# [Weekly Notes from June 1, 2006|WeeklyMeeting20060601]
# [Weekly Notes from June 8, 2006|WeeklyMeeting20060608]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006|IssuesAndRequirementsMeeting]
# [Mooring Meeting Notes from January 24, 2006|MooringMeetingNotesJanuary24]
# [Mooring Meeting Notes from January 31, 2006|MooringMeetingNotesJanuary31]
# [Mooring Meeting Notes from February 14, 2006|MooringMeetingNotesFebruary14]
# [Mooring Meeting Notes from February 27, 2006|MooringMeetingNotesFebruary27]
# [Mooring Meeting Notes from April 05, 2006|MooringMeetingNotesApril5]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">633</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">632</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006|WeeklyMeeting20060105r2]
# [Weekly Notes from January 12, 2006|WeeklyMeeting20060112]
# [Weekly Notes from January 26, 2006|WeeklyMeering20060126]
# [Weekly Notes from February 2, 2006|WeeklyMeeting20060202]
# [Weekly Notes from February 16, 2006|WeeklyMeeting20060216]
# [Weekly Notes from March 2, 2006|WeeklyMeeting20060302]
# [Weekly Notes from March 9, 2006|WeeklyMeeting20060309]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006|WeeklyMeeting20060323]
# [Weekly Notes from March 30, 2006|WeeklyMeeting20060330]
# [Weekly Notes from April 6, 2006|WeeklyMeeting20060406]
# [Weekly Notes from April 13, 2006|WeeklyMeeting20060413]
# [Weekly Notes from April 21, 2006|WeeklyMeeting20060421]
# [Weekly Notes from April 27, 2006|WeeklyMeeting20060427]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006|WeeklyMeeting20060518]
# [Weekly Notes from May 25, 2006|WeeklyMeeting20060525]
# [Weekly Notes from June 1, 2006|WeeklyMeeting20060601]
# [Weekly Notes from June 8, 2006|WeeklyMeeting20060608]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006|IssuesAndRequirementsMeeting]
# [Mooring Meeting Notes from January 24, 2006|MooringMeetingNotesJanuary24]
# [Mooring Meeting Notes from January 31, 2006|MooringMeetingNotesJanuary31]
# [Mooring Meeting Notes from February 14, 2006|MooringMeetingNotesFebruary14]
# [Mooring Meeting Notes from February 27, 2006|MooringMeetingNotesFebruary27]
# [Mooring Meeting Notes from April 05, 2006|MooringMeetingNotesApril5]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">634</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">634</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006|WeeklyMeeting20060302]
# [Weekly Notes from March 9, 2006|WeeklyMeeting20060309]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006|WeeklyMeeting20060323]
# [Weekly Notes from March 30, 2006|WeeklyMeeting20060330]
# [Weekly Notes from April 6, 2006|WeeklyMeeting20060406]
# [Weekly Notes from April 13, 2006|WeeklyMeeting20060413]
# [Weekly Notes from April 21, 2006|WeeklyMeeting20060421]
# [Weekly Notes from April 27, 2006|WeeklyMeeting20060427]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006|WeeklyMeeting20060518]
# [Weekly Notes from May 25, 2006|WeeklyMeeting20060525]
# [Weekly Notes from June 1, 2006|WeeklyMeeting20060601]
# [Weekly Notes from June 8, 2006|WeeklyMeeting20060608]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006|IssuesAndRequirementsMeeting]
# [Mooring Meeting Notes from January 24, 2006|MooringMeetingNotesJanuary24]
# [Mooring Meeting Notes from January 31, 2006|MooringMeetingNotesJanuary31]
# [Mooring Meeting Notes from February 14, 2006|MooringMeetingNotesFebruary14]
# [Mooring Meeting Notes from February 27, 2006|MooringMeetingNotesFebruary27]
# [Mooring Meeting Notes from April 05, 2006|MooringMeetingNotesApril5]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">636</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">628</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|ProjectMemosMinutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MTM-3 Web App|http://ssdspub.mbari.org:8080/mtm3]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">630</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">629</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

* MOOS Test Mooring Meeting (January 17, 2007) [MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">631</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">630</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

* MOOS Test Mooring Meeting (January 17, 2007) [MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">632</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810016</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777248</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810018</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777250</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">635</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">637</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">636</id>
<property name="body"><![CDATA[= Weekly Meeting Agenda =
== Updates Around The Table ==
=== Mike M ===
  1. New HOOVES/RCP
    * Struggling, but progress.
    * org.mbari.hooves in own CVS project "hooves"
    * Data binding framework that allowed model object to be used in forms.  Adding listener support for property changes.
    * So overall, RCP is going well.
    * HOOVES will be on hold for a bit for M0 data.
  1. DTS Job to copy data from old architecture to new.
    * Asking Neil to port that to a DTC job on Fog (Kevin needs to follow up with Neil, DTS jobs broken)
      * Look in master script for server polyp.
  1. M0 data request/more data processing
    * Will be impacted by meeting tomorrow.
    * Request is to access data from anytime period.
    * These are the post processed data sets.
    * Will meet with Reiko
    * Needs Andrew's work on the auto Perl module and will bite the bullet and go with new architecture.
    * Told John R about a week.
    * Notifications are enabled by listener properties, but does not address remote clients.
    * This could be based on a message bus architecture. dev.java.net project called event bus.

=== Andrew ===
  1. ACE update
    * Kent and Tom and list of to dos and pretty much done.  Waiting on them.  Still issue with tracking jars and how to deal with them.  Not currently working on it.
  1. XML Editor
    * Fallen by the wayside. Needing time to work on. Pick back up after architecture roll out.
  1. Caress data
    * Half way finished, will finish on contingency time.  Will do after perl module.
    * Front end is done, Google maps with our bathymetery.  Will need to sit down and go over to make sure it can extend.
  1. ANTLR
    * General parser that gives SSDS code parse tree.  Then generate perl modules. Moving into the SSDS code base. Other languages will proably be fairly straightforward.
  1. Benthic Rover Data Management
    * In conception right now.
    * Data should be showing up in mid 2006.

=== John ===
  1. M1 Turnaround status
    * Waiting on the new architecture before changing.
    * M0 puck needs to be reburned.
  1. We need to check to see if Paul has already re-burned the PUCK (yes, they have)
    * Tomorrows meeting:
      * Meet with John at 8:00 tomorrow.
  1. JSF/Web app flow (This is back to John)
    * Mike SWT components should be able to be exported to web pages.
    * Getting up and running on development environment, then focus on JSF.
  1. Documentation Status
    * Nothing but with JSF discussion
  1. NSF Proposal (likely to pull John off SSDS till February)
    * Not going forward, John back on SSDS.
  
=== Luis ===
  1. MMI status
    * Finished final workshop report.
    * SSDS problems with services (no progess).
  
=== Mike G ===
  1. ASAP Data Systems Update

=== Kevin ===
  1. SSDS Hours/Project Plan update
    * 2005
      * 320 allocated for core and we were 43 days over, if you adjust out 60 days MMI time, we were under by 17.
      * As a project we were over by 87 days (billable to SSDS)), if you adjust out 60 days MMI time, we were over by 27.
      * Kevin (144 allocated, spent 156: 12+)
      * John (90 allocated, spent 114: 24+) This is not correct, 60 days went against MMI
      * Andrew (82 allocated, spent 93: 11+)
      * Mike (36 days)
      * Nancy Barr (3 days)
      * Rich (3 days)
      * Dorothy (13 days)
      * Karen (4 days)
    * 2006 Allocations
      * Kevin: 126 days
      * John: 40 days <b><i>(is this correct?)</i></b>
      * Andrew: 20 days
  1. Need project schedule for 2006(this week)
  1. Development
    * General
      * New machine order HP dual athalon with Red Hat
      * Need to draft up deployment and migration scenario for new architecture/new machine
    * Web Application
      * Sputtering to life ([http://ssdsdevpc:8080/ssds http://ssdsdevpc:8080/ssds])
    * Core Metadata
    * Core Data
    * Clients
    * Model Integration
  1. MSE
    * Need to document requirements for data access (by tomorrow!)
    * No update on data policy
  1. ASAP
    * Need to meet with Mike G to discuss schema changes.

== Action Items ==
  1. Getting new architecture rolled out is critical (time wise)
  1. Finish up DTS job migration
  1. Get project plan done and identify tasks for developers
  1. Look at [https://eventbus.dev.java.net/ eventbus:] as possible solution for remote model object notificaton (and other SSDS stuff).
  1. Finish getting John's development environment going
  1. Get ASAP update from Mike G.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">638</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810025</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.24 for me.
{note}

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

# I then created a user that will have all rights to the databases that SSDS will use to connect:

create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'

# I then granted all rights to the databases for the newly created user

GRANT ALL TO ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL TO ssds_metadata.* TO 'ssdsadmin'@'localhost';
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777257</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810023</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

# I then created a user that will have all rights to the databases that SSDS will use to connect:

create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'

# I then granted all rights to the databases for the newly created user

GRANT ALL TO ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL TO ssds_metadata.* TO 'ssdsadmin'@'localhost';
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777255</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810021</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

# I first ssh'd into the kainani and then started up the mysql client using
/opt/csw/mysql5/bin/mysql --user=root --password
# I then created the two needed databases using:
create database ssds_data;
create database ssds_metadata;

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777253</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810019</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777251</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16810027</id>
<property name="body"><![CDATA[The ALOHA group contacted MBARI about using SSDS and SIAM for a deployment that they were working towards for January of 2011.  This page documents the work to get that installation up and running for them.

h5. Meeting Notes

# [April 27, 2010]

h5. Installation Notes

These notes document what was done to configure the SSDS installation in HAWAII on the machine kainani.soest.hawaii.edu.  There are a couple of accounts that I used on kainani during the installation.  They are:

# kgomes
# jboss

I also used the 'root' account on the mysql installation for the work I was doing on the database.

{note:title=JBoss and Java were installed by the sysadmin}
For this particular installation, the folks in Hawaii installed JBoss 5.1.0GA and Java 6.0.24 for me.
{note}

# I first ssh'd into the kainani and then started up the mysql client using

/opt/csw/mysql5/bin/mysql --user=root --password

# I then created the two needed databases using:

create database ssds_data;
create database ssds_metadata;

# I then created a user that will have all rights to the databases that SSDS will use to connect:

create user 'ssdsadmin'@'localhost IDENTIFIED BY 'XXXXXXX'

# I then granted all rights to the databases for the newly created user

GRANT ALL TO ssds_data.* TO 'ssdsadmin'@'localhost';
GRANT ALL TO ssds_metadata.* TO 'ssdsadmin'@'localhost';

# I then checked out the source code on my local machine and also installed JBoss 5.1.0GA locally and Flex SDK so I could compile everything locally for a remote deployment.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">16777259</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830026</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797282</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830023</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797279</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830024</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797280</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830021</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797277</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830019</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797275</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830033</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | split into:
# timestampSeconds
# timestampNanoseconds | # timestampSeconds
# timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797289</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830031</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | split into:
# timestampSeconds
# timestampNanoseconds | # timestampSeconds
# timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
* Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797287</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5406936</id>
<property name="body"><![CDATA[From [~mccann]:

{quote}
I thought I'd share this little bit of success.  

With Matlab 2008a on Windows we are able to interact with SSDS Metadata via the client jar file.
The path to the jar file does need to be added to Matlab's static javaclasspath.  Do this by 
adding the path to the jar file to C:\Program Files\MATLAB\R2008a\toolbox\local\classpth.txt,
e.g. '$matlabroot/work/java/ssds-services-metadata-client-new-ssds.jar'.  Then restart Matlab.

Here's some example commands:
{code}
% Import SSDS package
import moos.ssds.services.metadata.*

% Get Home interface
home = moos.ssds.services.metadata.DataProducerAccessUtil.getHome();

% Get Access object
dpAccess = home.create();

% Call methods on the Access object
dpAccess.countFindParentlessDeployments
dpAccess.countFindByName('Back', logical(0))

% Get a specific instrument deployment and print out some properties
dList = dpAccess.findByName( ....
        'Backscatterometer (2006-10-17T00:53:30Z - 8) UUID=edb274f1-9277-11da-a72b-0800200c9a66', ...
        logical(1), 'id', 'ascending', logical(1));
it = dList.iterator;
d = it.next;
d.getName
d.getStartDate
d.getDevice.getMfgSerialNumber
{code}

(You may ignore the FileNotFoundException for \opt\ssds\logs\ssds-client.log - Kevin says he'll fix that.)
{quote}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374189</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830030</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | split into:
# timestampSeconds
# timestampNanoseconds | # timestampSeconds
# timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
* Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | recordType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797286</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5406935</id>
<property name="body"><![CDATA[From [~mccann]:

{quote}
I thought I'd share this little bit of success.  

With Matlab 2008a on Windows we are able to interact with SSDS Metadata via the client jar file.
The path to the jar file does need to be added to Matlab's static javaclasspath.  Do this by 
adding the path to the jar file to C:\Program Files\MATLAB\R2008a\toolbox\local\classpth.txt,
e.g. '$matlabroot/work/java/ssds-services-metadata-client-new-ssds.jar'.  Then restart Matlab.

Here's some example commands:

% Import SSDS package
import moos.ssds.services.metadata.*

% Get Home interface
home = moos.ssds.services.metadata.DataProducerAccessUtil.getHome();

% Get Access object
dpAccess = home.create();

% Call methods on the Access object
dpAccess.countFindParentlessDeployments
dpAccess.countFindByName('Back', logical(0))

% Get a specific instrument deployment and print out some properties
dList = dpAccess.findByName('Backscatterometer (2006-10-17T00:53:30Z - 8) UUID=edb274f1-9277-11da-a72b-0800200c9a66', logical(1), 'id', 'ascending', logical(1));
it = dList.iterator;
d = it.next;
d.getName
d.getStartDate
d.getDevice.getMfgSerialNumber


(You may ignore the FileNotFoundException for \opt\ssds\logs\ssds-client.log - Kevin says he'll fix that.)
{quote}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374188</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830028</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
| SSDSDevicePacket | Translation Rule | SSDS Byte Array |
| sourceID | direct copy | sourceID |
| systemTime | split into:
# timestampSeconds
# timestampNanoseconds | # timestampSeconds
# timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797284</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">5406926</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">5374178</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830036</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called).| | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797292</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830035</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored | |
| timestampSeconds | direct copy | | timestampSeconds |
| timestampNanoseconds | direct copy | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797291</id>
</property>
</object>
<object class="Labelling" package="com.atlassian.confluence.labels">
<id name="id">8290315</id>
<property name="label" class="Label" package="com.atlassian.confluence.labels"><id name="id">2</id>
</property>
<property name="content" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">9</id>
</property>
<property name="spaceKey"><![CDATA[SSDS]]></property>
<property name="user"><![CDATA[kgomes]]></property>
<property name="creationDate">2008-12-26 21:20:21.240</property>
<property name="lastModificationDate">2008-12-26 21:20:21.240</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">675</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
## AUVCTD
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
## OASIS
## CIMT
## AUVCTD
## Data Aggregation
## SENSORS
## UW to Microsoft Proposal
## UCSD Response to CI IO
## MBARI Response to CI IO
## LOOKING
## AOSN
## SNMP
## NOAA Proposal
## Nekton Research
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website (?)
## What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">678</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">676</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
### Funded another year (June 2008)
## AUVCTD
## Post processing of all of the above
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
### Post processing of profiler data
### Metadata and other user interfaces
#### HOOVES and metadata editing
### Camera integration (data stream)
### Watch circle alarm
### Processes and procedures development (metadata is inconsistent) on MSE - operations
### Andrew's ACE stuff (Tom) User interface and business logic.
## OASIS
### M! Turn
### M2 Turn
### NDBC Cleanup (CIMT mooring)
### Ops procedures and people/tools/training (XML and turns)
## CIMT
### 2 turns (?)
## AUVCTD
### ssdsLoads is broken
### HOOVES
## SENSORS
### Connect the instrument interface prototype up to SSDS on MARS (adapter or alternate ingest mechanism)
----
## Data Aggregation
### Meetings
### (?)
## UW to Microsoft Proposal (RCO)
### "We (TBD) will bring SSDS up to UW and operate". SSDS collects and then Triton (WorldWind++) visualizes it. It will tie into  the .NET 3.0 Workflow Framework.
## UCSD Response to CI IO
### FIREWALLED
## MBARI Response to CI IO
### FIREWALLED
## CSO IO
### Possibley a temporary system to serve as a CI proxy.
## LOOKING
## AOSN
## NOAA Proposal
## SNMP
## NCSA Proposal
## Nekton Research
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website (?)
## What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">679</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">677</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
### Funded another year (June 2008)
## AUVCTD
## Post processing of all of the above
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
### Post processing of profiler data
### Metadata and other user interfaces
#### HOOVES and metadata editing
### Camera integration (data stream)
### Watch circle alarm
### Processes and procedures development (metadata is inconsistent) on MSE - operations
### Andrew's ACE stuff (Tom) User interface and business logic.
## OASIS
### M! Turn
### M2 Turn
### NDBC Cleanup (CIMT mooring)
### Ops procedures and people/tools/training (XML and turns)
## CIMT
### 2 turns (?)
## AUVCTD
### ssdsLoads is broken
### HOOVES
## SENSORS
### Connect the instrument interface prototype up to SSDS on MARS (adapter or alternate ingest mechanism)
----
## Data Aggregation
### Meetings
### (?)
## UW to Microsoft Proposal (RCO)
### "We (TBD) will bring SSDS up to UW and operate". SSDS collects and then Triton (WorldWind++) visualizes it. It will tie into  the .NET 3.0 Workflow Framework.
## UCSD Response to CI IO
### FIREWALLED
## MBARI Response to CI IO
### FIREWALLED
## CSO IO
### Possibly a temporary system to serve as a CI proxy.
## LOOKING (20 days)
### Jim wants to merge AOSN Data System and SSDS and then connect COOP and MoQUA to that.
### Federated observatory prototype include components of SSDS as repository (catalog, processing and preserving data)
## AOSN
### If Jim uses looking for merge, AOSN will use that. Dependent on LOOKING.
## SNMP is an activity
### ESB at NCSA
### ESB at MBARI
### Sending packets back and forth.
### To get diagram
### SENSORS build instrument interface and connect to ESB.
### SSDS is on ESB to collect and catalog data.
## NCSA Proposal to NSF to extend SNMP work (keeps it going)
### Product are offered to community (OpenSource)
## Nekton Research/NOAA
### 
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website (?)
## What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">680</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">678</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
### Funded another year (June 2008)
## AUVCTD
## Post processing of all of the above
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
### Post processing of profiler data
### Metadata and other user interfaces
#### HOOVES and metadata editing
### Camera integration (data stream)
### Watch circle alarm
### Processes and procedures development (metadata is inconsistent) on MSE - operations
### Andrew's ACE stuff (Tom) User interface and business logic.
## OASIS
### M! Turn
### M2 Turn
### NDBC Cleanup (CIMT mooring)
### Ops procedures and people/tools/training (XML and turns)
## CIMT
### 2 turns (?)
## AUVCTD
### ssdsLoads is broken
### HOOVES
## SENSORS
### Connect the instrument interface prototype up to SSDS on MARS (adapter or alternate ingest mechanism)
----
## Data Aggregation
### Meetings
### (?)
## UW to Microsoft Proposal (RCO)
### "We (TBD) will bring SSDS up to UW and operate". SSDS collects and then Triton (WorldWind++) visualizes it. It will tie into  the .NET 3.0 Workflow Framework.
## UCSD Response to CI IO
### FIREWALLED
## MBARI Response to CI IO
### FIREWALLED
## CSO IO
### Possibly a temporary system to serve as a CI proxy.
## LOOKING (20 days)
### Jim wants to merge AOSN Data System and SSDS and then connect COOP and MoQUA to that.
### Federated observatory prototype include components of SSDS as repository (catalog, processing and preserving data)
## AOSN
### If Jim uses looking for merge, AOSN will use that. Dependent on LOOKING.
## SNMP is an activity
### ESB at NCSA
### ESB at MBARI
### Sending packets back and forth.
### To get diagram
### SENSORS build instrument interface and connect to ESB.
### SSDS is on ESB to collect and catalog data.
## NCSA Proposal to NSF to extend SNMP work (keeps it going)
### Product are offered to community (OpenSource)
## Nekton Research/NOAA
### MBARI share SSDS code
### Nekton will package SSDS with 2 AUVs delivered.
### Get Nekton engineers to be self reliant with SSDS.
### Would they be interested in AUV science data processing?
### Would need something like AUVCTD portal code to convert Nekton AUV data to XML/SSDS Data model.
### Conference call with them.
## NOAA Proposal (Francisco)
### (?)
## CenCOOS (?) Related to NOAA Proposal and Data Aggregation?
## Dalhousie (?)
### Waiting on us to deliver exportable code (they can compile and run).
### Preconfigured properties for building for them
### Tracking metadata and data for their moorings.
### They might provide some user interfaces for SSDS.
### Haven't talked to them in a while.
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
## Metadata editing/management
## Plan for the transition (written) and resources needed
## Move core to support or vice versa.
## Documentation
## Move to Subversion (get rid of branches)
## Plan and agreement for future work/development
## Operational interfaces (component health/statistics/log crawlers)
## Controlled vocabularies (instrument types)
# How do we best open source SSDS?
## Current licensing website (?)
## What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">681</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4947969</id>
<property name="body"><![CDATA[The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. Currently Open JIRA Tasks/Bugs
{jiraissues:http://oceana.shore.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=1000}

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915201</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4947970</id>
<property name="body"><![CDATA[The current work (tasks) for SSDS are basically targeted at these main areas:
# [Cleanup Configuration Management]
# [Internal Application Consolidation]
# [Metadata Integrity Checking-Repairing-Enhancing]
# [Improve Testing]
# [Enhance Access Interfaces]
# [Improve Data Ingest Mechanisms]
# [Documentation]
# [Prepare for Opening to Community]

h3. Currently Open JIRA Tasks/Bugs
{jiraissues:https://oceana.mbari.org:8082/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?&pid=10000&status=1&sorter/field=issuekey&sorter/order=DESC&sorter/field=priority&sorter/order=DESC&tempMax=1000}

h3. 900823 SSDS Hardening Original Tasks List (Proposal)

# Cleanup Configuration Management *(4 days - 3 KG, 1 MM)*
## (2 days) Finish build overhaul (done on Mac) to make sure SSDS can be built easily (common sense defaults) and that all components work with JBoss/MySQL combination.
## (.5 day) Setup javadoc deployment as part of build task
## (.5 day) Verify that wrapper generator unit test are on during test target of build.
## (.5 day) Create some template startup scripts and document
# Internal application Consolidation *(10 days SE - 5 KG, 5 MM, 10 days I.S.)*
## (1 day) Look at SSDS_Metadata database for all urls that point to ssds.shore.mbari.org and see if we can point those to new-ssds or DODS.
## (1 day) Look at SSDS_Metadata database for all urls that point to dods.shore.mbari.org and see if we can point those to dods.mbari.org.
## (.5 day) Shutdown web server on predator (dods too).
## (.5 day) Look at all web applications on predator and see if we simply CNAME ssds.shore.mbari.org to new-ssds, that will work OK.
## (.5 day) Shutdown jboss on predator.
## (.5 day) Plan shutdown time for predator.
## (1 day) Backup files off predator. (should we migrate UpdateBot and Graphing stuff to elvis?).
## (0 day for SSDS-I.S. request) Have Pat upgrade predator to RHE.
## (.5 day) Reinstall updateBot and graphing software and restart.
## (2 day) Figure out what ssds.mbari.org is right now, move content to web application and CNAME ssds.mbari.org to new-ssds.mbari.org (or rename new-ssds.mbari.org to ssds.mbari.org and CNAME new-ssds to ssds.mbari.org)
## (.5 day - I.S.) Remove Microsoft SQL Server on SSDSPub
## (.5 day) Remove data directories on SSDPub
## (.5 day) Clean everything up and look at making SSDSPub just a Tomcat installation to house web applications
## (.5 day) Verify data replication from tornado to ssdspub is turned off (remove data from ssdspub too)
## (.5 day) Verify the GetOriginalDataServlet on ssds.shore and ssdpsub simply forward on to the same servlet on new-ssds
## (.5 day) Remove the SSDS database from Solstice (backup first)
## (.5 day) Remove the SSDS database from Fog (backup first)
## (.5 day) Backup and remove all DTS's except on Fog for Solstice-SSDS_Metadata->Fog-SSDS_Metadata
# Prepare for opening to community *(3 days - 3 KG)*
## (.5 day) Put Copyright in all SSDS source code and zip up and make externally available.
## (2 days) Setup Source on public repository
# Metadata Integrity Checking/Repairing/Enhancing *(33 days - 11 KG, 10 MM, 12 RS)*
## (3 days) Have updateBot check all resources and if they do not have a ResourceType, use the file extension to map it to a MIMEType and create a ResourceType (this will allow queries for specific resources)
## (1 day) Have updateBot crawl all resources and update contentLength if not specified.
## (10 days) Lookup standard variables and standardUnits from UCAR and have UpdateBot mechanism add them to those without (for NetCDF, try to pull StandardVariable and update SSDS).
## (2 days) Implement a mechanism that updates the true end date/time on the DataContainer for data streams to show the latest data for each stream (should also update the number of records).
## (5 days) Look into having SSDS create "README" type files in the same location as certain DataContainers.
### These could/should be in FGDC format(?)
## (12 days) Refactor and reinstate the SQL integrity checks Rich wrote.
# Enhance Access Interfaces *(42 days - 20 KG, 22 MM)*
## (2 days) Develop web page to allow administrators to configure plot creation
## (5 days) Finish implementing all DAOs
### Make sure all methods have associated count method
### Make sure all methods have boolean option for return full graph
### Make sure all methods have capability to specify a sort by field
### Verify returned DataContainer collections should be sorted by start date as default
### Verify implemented query for DataContainer by DataContainerGroup
## (.5 day) Verify PC02 plots are working after M0 turnaround
## (.5 day) Add links to CVS XML on device pages
## (1 day) Need a mechanism for users to upload and store "Resources" in SSDS (some secure/backed up network location) and link them to other resource aware objects.
## (.5 day) In Explorer, truncate long deployment names
## (5 days) Implement more queries in Explorer
### Desire in long term for common 'status reporting' system for instruments (something like an ops portal)
### Find all post products from deployment
### Find all resources of certain types (graphics, log files, calibration files, etc.)
### "I want the Air Temperature (StandardVariable.name) from the DataProducer named "M1" from such and such to such and such a time."
### Given a deployment, can I have a query mechanism that can automatically walk up the tree to find the parent DataProducer of type Deployment?
### Given a deployment, can I walk up the parent tree to look for a parent with a certain role?
### "Give me all QC'd data and realtime data up to now".  This would need to pull the best QC'd data for some sampled parameter and then integrate it with the realtime, un-QC'd data from streaming data.
## (5 days) Migrate HOOVES to new architecture
## (22 days) Add HOOVES improvements
### Full edit pages for deployment information
### Tree structure for dataset variables that are functions of depth
### SGT-driven contour plots of ZT data (e.g. ADCP, CTD String)
### Faster variable list generation by using DODS rather than netCDF API
### More consistent use of resourceType contentType info (MIME types)
### Top-level data set display for platform level deployment nodes
### Additional queries:
#### by standard variable name
#### by lat/lon rubber band box via mini maplet gui interface
### Fix Bugs:
#### Window sizing on startup
#### thread/hash problem with multiple plots
#### Numerics not showing for some data sets
# Develop admin application to edit all metadata objects and their relationships *(11 days - 11 KG)*
## One function should be able to change the start time on a DataProducer and have an option to update all the child deployment (deep update) to that same start time.
## Build web pages that allow user to send messages to different topics in the ingest component
## Build web page that will allow a user to load data packets into the database from the file storage mechanism. (user selects device and time window).
## Replace instrument monitoring to read open deployments from SSDS and have configuration options.
# Improve Data Ingest Mechanisms *(8 days - 8 KG)*
## (.5 day) Try to change OASIS to make mooring turns less painful (documentation basically)
## (5 days) Build non-JMS mechanism for users to send data/metadata to SSDS. 
## (1 day) Put true exception handling in SQLIngest to throw messages when the DB can't be reached.
## (1 day) Change PacketSQLOutput/Input to work with any database (not just MS SQL)
# Improve Testing *(5 days - 3 KG, 2MM)*
## (.5 day) Verify (unit tests) that the RecordDescription level parse regular expression works
## (.5 day) Make sure XML dates that are coming out of XMLBuilder/ObjectBuilder cycle can be parsed by the XMLDateFormat.
## (.5 day) Check Object Builder/XML builder to make sure it handles URI/URL/UriString/DODSUrl/X/Y/Zoffsets correctly.
## (.5 day) Write valid unit test for Object and XMLBuilders
## (.5 day) Make sure object Schema/ObjectBuilder/XMLBuilder only use one DataContainer/DataProducer for output, input, consumer, tags.
## (.5 day) Write tests for ResourceBLOB->ObjectBuilder for byte array and verify that it is working correctly.
## (2 days) Improve Wrapper tests
# Documentation *(6 days - 3 KG, 3 MM)*
## (.5 day) Put UML diagram of data model on developer section of web app.
## (.5 day) Finish documenting data packet structure on web pages.
## (5 days) Document Explorer, Admin app and HOOVES

h3. Tasks that were descoped from 900823 SSDS Hardening Proposal
# Setup SPLUNK to monitor SSDS system logs (JBoss, Apache, UNIX system)
# Can we setup SSDS so that if a certain process/data container were deemed bad, that you could prevent any reprocessing of that data using that process from happening?
# Mike M had new idea about extending our model classes to implement remote lazy loading ... interesting idea and I would like to add that functionality later.
# Can I embed the business logic documentation as JavaDoc tags in the source code and then export that somewhere?  This is specifically related to the EJB services.
# Add end of line terminator as separator in parsing packet records (not files)
# Implement fixed format (length) parsing
# Implement way to handle multi-record data
# Allow user's to "annotate" DataContainer by storing comments
# Design architecture for plug-in type functionality for servlet type access (i.e. inline filters for data like calculate salinity on the fly)
## Add a standard capability to SSDS to do things like mx+b, quadratics, using multiple variables in calculations (these should be able to be defined in the XML and SSDS do them automatically)
# Refactor navigation menus and scheme for SSDS site and post processed pages (left menu)
## Need to add rest of SSDS web page content to main SSDS pages
# Web pages to help with automated workflows(?)
# Create web page to do variable/variable plots (with some query capability)
# Create page to merge data from different sources (could we use Francisco's help/resources:By Platform,By Instrument,By Variable,By Lat/Lon Box,map with AUV track and moorings/instruments,data from AUV/Moorings/Ships merged by time (plots and raw data)
# For application that show lots of graphics, implement thumbnails (click to enlarge)
# SIAMRawDataAccess Page -> The list of instruments and parents doesn't show what is current.  Maybe I can put a time/date of last update next to the instrument.
# Build web form to help developers build URLs that they can use in their code to access data from SSDS
# Somehow need to tell SSDS user's that they need to specify an acknowledgement of MBARI when users utilize the data from SSDS.
# Implement mechanism (web page, email notification) that allows valid users to approve or map additional relationship and then notify the user of that change so they can change their source.  This should be tied into UpdateBot so that it knows what associations it can make between RecordVariable and StandardVarible, for example.
## StandardVariables
## StandardUnits
## StandardKeywords
## StandardDomain
## StandardReferenceScale
## DeviceType
## ResourceType
## DataProducerGroup
## DataContainerGroup
# GoogleMaps/GoogleEarth/Worldwind integration
# Instead of using command line argument for timezone->UTC, look at [http://www.hibernate.org/100.html Hibernate code] for UTC dates.
# Put statistics on plots (min/max of past 24 hrs, latest read value), use max, mins to drive axis range (no autoranging)
# Where data are dense enough to make for easy viewing, use scatter instead of line plots, leaving gaps for missing data (if lines must be used, put breaks where data gaps are)
# Setup DeviceQCPlotCreator to create plots with multiple lines on one chart (and separate axes).
# Make any direction plot (wind, heading, etc.) plot as points, not lines
# Put nominal lattitude and longitude in plot titles
# Have capability to turn on/off autoscale on plots and specify range
# Create servlet that dynamically generates schema and puts in tokens from class constants and database entries.  For example, DeviceTypes, ResourceTypes, StandardXXXXXs
# Build application to allow users to add QC flags and comments to data packets in SSDS_Data
# Convert ingest to pull metadata revision number from XML instead of metadata sequence number from packet
# Add mechanism to notify users of new data arrival (method TBD)
## Look into NRSS (RSS for data streams)
# In PacketOutputManager, implement a cleanup watchdog (You could do this by keeping another hashmap that had the key deviceID_metadataRevision_recordType_platformID and then a value of last time accessed.  Have the watchdog loop through those and PacketOutputs that have not been accessed in some interval get closed and removed from the packetOutputs hashmap)
# Add software to crawl SQL packets, read in corresponding GPS data and attach to packet
## (5 days) Remove Deployment info from PUCK XML and move all to new schema and validate (due to the amount of work to do this, it will be done on an as needed basis)
# Could we move applications on SSDSPub to another machine with Tomcat and CNAME ssdspub to that machine?
# Follow up on PUCK configuration tool (ACE)
# *Build services to read data from DataContainers that are files through the query interface (not just from packets).* (This is really valuable, but not REALLY needed)
# Look into implementing paging in services (Hibernate supports this).
# Load historical OASIS data into SSDS (data and metadata). *This is important but too big for this, separate project*
## Figure out how we will integrate data files offloaded from instruments when they are recovered. (generalize to any data file and this might be a location where the file can be place with appropriate metadata and it will be loaded into SSDS.  SSDS can even do some thinking like with NetCDF files). *IMPORTANT EVEN THOUGH DESCOPED*
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915202</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">18645288</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [SPEPRJ:Installing RabbitMQ (AMQP) on RHEL5]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]
# [Debugging quick look and contour wind stick plots]
# [SQL 2008 Upgrade and Move to Dione]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">18579773</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">18645287</id>
<property name="body"><![CDATA[h2. Debugging quick look and contour wind stick plots

The quick look plots on the public Oasis data page ([http://www.mbari.org/oasis/qc/index.html]) are created by the SSDS-driven NetCDF processing that runs on elvis every 2 hours.  To start with understanding the processing look at the crontab for the ssdsadmin account on elvis.  There are some notes in the TROUBLESHOOT file in /u/ssdsadmin/dev/DPforSSDS/cimt to help with running the main scripts (DStoNetCDF.pl, combineTS.pl, combineMet.pl, combineAll.pl) for a specific deployment.  All of the Perl code that builds the Ferret .jnl files which produce the plots are in the ssds_util.pl library.  In addition all of the processing is reported to SSDS with DataProducers with the plots files generated recorded as Resources.  One could search and walk through the processing provenance in SSDS to find the script that produced a plot.

A "side effect" of the main processing is the creation of the current_qcPlots.html web page produced for each mooring that is processed. This page has some short-cut links to the Ferret scripts (jnl files) that produce the plots.  All of the pages linked in the Plots column ('full Deployment' and 'last 7 days') have a link at the top that points to the .jnl file that produced the plots on the page.  The Ferret commands can be copy and pasted from the jnl page into a ferret session.  I suggest running ferret on elvis and remoting the X-Display to your computer.

The "Last 30 day Wind Temperature contour" and "Last 30 day Wind Salinity contour" GIF images are created by a jnl file that is in the same directory as the images.  Edit the URL to examine the contents or the directory and see the Ferret commands that produce the plot.  It's helpful to copy the USE and SET REGION commands from the .jnl page into a ferret session and examine the data to debug what might be wrong in producing the plots.

h4. A. Initial look at the data

Here's an example of doing this (with the SET REGION command edited to list just the last day's data) - the problem being analyzed is gappy subsurface data:
{noformat}
 > ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        30-May-11 21:59

yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
yes? SET REGION/T="30-May-2011 04:43":"31-May-2011 04:43"
yes? list sea_water_temperature_hr
             VARIABLE : Sea Water Temperature (Celsius)
             DATA SET : Hourly Gridded MBARI Mooring M1 Sea Water Temperature and Salinity Observations
             FILENAME : OS_M1_20101027hourly_CMSTV.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 11 by 24 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                             1      10     20     40     60     80    100    150    200    250    300
                              1      2      3      4      5      6      7      8      9     10     11
 30-MAY-2011 04:30 / 5145:  10.77   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 05:30 / 5146:  10.69   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 06:30 / 5147:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 07:30 / 5148:  10.49   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 08:30 / 5149:  10.42   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 09:30 / 5150:  10.29   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 10:30 / 5151:  10.23   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 11:30 / 5152:  10.33   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 12:30 / 5153:  10.35   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 30-MAY-2011 13:30 / 5154:  10.34   ....   ....   9.56   9.08   8.85   8.39   8.10   7.89   7.59   7.51
 30-MAY-2011 14:30 / 5155:  10.36   ....   ....   9.28   8.92   8.70   8.46   8.12   7.90   7.60   7.51
 30-MAY-2011 15:30 / 5156:  10.38   ....   ....   9.26   8.92   8.73   8.39   8.11   7.93   7.67   7.50
 30-MAY-2011 16:30 / 5157:  10.45   ....   ....   9.38   9.04   8.81   8.38   8.11   7.93   7.68   7.49
 30-MAY-2011 17:30 / 5158:  10.50   ....   ....   9.55   9.13   8.89   8.64   8.15   7.96   7.68   7.49
 30-MAY-2011 18:30 / 5159:  10.76   ....   ....  10.16   9.14   8.90   8.71   8.26   7.97   7.67   7.49
 30-MAY-2011 19:30 / 5160:  11.06   ....   ....  10.15   9.10   8.91   8.69   8.25   7.98   7.69   7.50
 30-MAY-2011 20:30 / 5161:  11.33   ....   ....  10.18   9.07   8.90   8.61   8.21   8.01   7.69   7.49
 30-MAY-2011 21:30 / 5162:  11.37   ....   ....   9.75   9.03   8.83   8.50   8.24   7.99   7.69   7.49
 30-MAY-2011 22:30 / 5163:  11.10   ....   ....   9.85   9.04   8.83   8.51   8.27   7.99   7.69   7.50
 30-MAY-2011 23:30 / 5164:  11.05   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 00:30 / 5165:  10.90   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 01:30 / 5166:  10.84   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 02:30 / 5167:  10.59   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 31-MAY-2011 03:30 / 5168:  10.37   ....   ....   ....   ....   ....   ....   ....   ....   ....   ....
 
{noformat}
The many '....'s indicate missing data in this hourly gridded file.  Let's look upstream in the data processing to see what the input data looks like.  The .jnl file that created the 201010/OS_M1_20101027hourly_CMSTV.nc file simply USEd the TS data. Listing the data from the TS file shows the same gappy data as above.  So let's look at the input data to the TS file.  The jnl file link in the Data column in the _\[TS: \]_ row. Listing the data from the individual input files shows that they apparently do not have the gaps that are shown int he gridded data set:
{noformat}
yes? USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0010_20101027_original.nc"
yes? list temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 140 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                                122W
                                  1
 30-MAY-2011 04:49:31 / 30019:  10.73
 30-MAY-2011 04:59:30 / 30020:  10.72
 30-MAY-2011 05:09:31 / 30021:  10.70
 30-MAY-2011 05:19:29 / 30022:  10.70
 30-MAY-2011 05:29:30 / 30023:  10.69
 30-MAY-2011 05:39:31 / 30024:  10.69
(records skipped)
 31-MAY-2011 02:59:30 / 30152:  10.12
 31-MAY-2011 03:09:31 / 30153:  10.06
 31-MAY-2011 03:19:30 / 30154:  10.08
 31-MAY-2011 03:29:30 / 30155:  10.07
 31-MAY-2011 03:39:29 / 30156:  10.06
 31-MAY-2011 03:49:31 / 30157:  10.08
 31-MAY-2011 03:59:30 / 30158:  10.05

{noformat}\\

h4. B. Tips for debugging with Ferret

To figure out what is going wrong we'll need to execute more of the Ferret commands from the jnl file that creates the TS file and examine the data at each step.  This is an interactive process that involves editing a temporary .jnl file, executing it in ferret with a "GO <jnl_file>" and analyzing the output.  Here are some more tips for diagnosing problems:
# Examine the production ferret output - this is the 'out' link on the current_qcPlots.html web page
# Examine CVS for changes in the source code - the change log for combineTS.pl (the script that produces the jnl file link in the Data column in the _\[TS: \]_ row) is [http://moonjelly.shore.mbari.org/cgi-bin/viewvc.cgi/DPforSSDS/cimt/combineTS.pl?view=log]
# Examine the data and plots for the individual microcats on the current_qcPlots.html web page
# Read the excellent online Ferret documentation, starting with the "Thinking like a Ferret" page: [http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/introduction/GETTING-STARTED]

To follow through with this example of gappy data I took these steps:
# Copied the OS_MBARI-M1_20101027_R_TS.jnl file from it's production location (/mbari/ssdsdata/deployments/m1/201010) to /tmp
# Edited the file to process and save only the 1m and 10m data and save the date to a temporary netcdf file in /tmp
# Executed the temporary truncated file from a Ferret session

{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"
! Description: Produce netCDF file of all Temperature and Salinity measurements from a mooring
!              Pull data from original instrument netCDF files and grid onto a common grid.
!              Automatically generated by ./combineTS.pl on Tue May 31 09:37:27 2011.
!              For information on Ferret see http://ferret.wrc.noaa.gov/Ferret/.
!

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:`PSAL,return=lend`/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 !-> LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/KLIMITS=1:11/LLIMITS=1:5182/Z=1/T="27-Oct-2010 21:00:00":"31-May-2011 16:00:00" PSAL,
PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc
 **TMAP ERR: error in line definition
             disordered output coordinate value:  22215.      Axis: TIME
LIST/FORMAT=CDF/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 20:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
Command file, command group, or REPEAT execution aborted
yes?
{noformat}
This looks like a good clue. The 10m data are not being written to the output file and we are getting this obscure "disordered output coordinate value" error from Ferret. We need to get to the bottom of this.  Here are some more tips on how to proceed:
# Use the Ferret mail list archive () or Google to search for the meaning of this error message
# Join the Ferret mail list and post your question.  Solutions are typically provided within a day.
# Examine the input data and variables using ncdump(1) or Ferret LIST and SHOW commands

Here are some Ferret commands to examine the first 3 temperature values from the 1m and 10m input CTD data and the first 3 times of the output axis:
{noformat}
yes? list/l=1:3/d=1 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1338 at original sampling intervals
             FILENAME : m1_ctd0001_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 1
                            122W
                              1
 27-OCT-2010 21:08:43 / 1:  14.01
 27-OCT-2010 21:22:27 / 2:  14.10
 27-OCT-2010 21:28:23 / 3:  14.10
yes? list/l=1:3/d=2 temperature
             VARIABLE : Water Temperature (deg C)
             DATA SET : Mooring M1 CTD data from MBARI instrument id 1491 at original sampling intervals
             FILENAME : m1_ctd0010_20101027_original.nc
             FILEPATH : http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/
             SUBSET   : 3 points (TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
             DEPTH (m): 10
                            122W
                              1
 27-OCT-2010 20:11:17 / 1:  13.38
 27-OCT-2010 20:21:16 / 2:  13.59
 27-OCT-2010 20:31:16 / 3:  13.45
yes? show/l=1:3 axis time
 name       axis              # pts   start                end
 TIME      TIME              5181 r   27-OCT-2010 20:30    31-MAY-2011 16:30
T0 = 01-JAN-1950 00:00:00
   Axis span (to cell edges) = 215.875

       L     T                   TBOX      TBOXLO                TSTEP (DAYS)
       1>  27-OCT-2010 20:30:00  0.0416667  27-OCT-2010 20:00:00    22214.85
       2>  27-OCT-2010 21:30:00  0.0416667  27-OCT-2010 21:00:00    22214.9
       3>  27-OCT-2010 22:30:00  0.0416667  27-OCT-2010 22:00:00    22214.94
{noformat}\\

h4. C. Fixing the start times for all the child instrument deployments

The problem seems to be that the 10m data begin at 20:11:17 before the 1m data at 21:08:43. The first write of the 1m data to the output netCDF file gives the file its shape with the KLIMITS= and LLIMITS= options. Writing the 10m data, which begins in before the bounds that were defined violates Ferret's axis ordering logic. To test this hypothesis edit the SAVE statement in the temporary .jnl file to make the start time for the 10m data 21:00, execute it and then examine the output file:
{noformat}
yes? go "/tmp/OS_MBARI-M1_20101027_R_TS.jnl"

<snip>

SAVE/FILE="/tmp/OS_MBARI-M1_20101027_R_TS.nc"/APPEND/Z=10/T="27-Oct-2010 21:00:00":"31-May-2011 15:00:00" PSAL, PSAL_QC, TEMP, TEMP_QC, TIME_QC, POSITION_QC, DEPTH_QC
 LISTing to file /tmp/OS_MBARI-M1_20101027_R_TS.nc

(Another ferret session)
> ferret
        NOAA/PMEL TMAP
        FERRET v6.62
        Linux rh5 (gfortran) 2.6.18-164.11.1.el5 - 06/11/10
        31-May-11 12:19

yes? use "/tmp/OS_MBARI-M1_20101027_R_TS.nc"
yes? list/l=1:10 temp
             VARIABLE : Hourly sea_water_temperature (celsius)
             FILENAME : OS_MBARI-M1_20101027_R_TS.nc
             FILEPATH : /tmp/
             SUBSET   : 11 by 10 points (DEPTH (m)-TIME)
             LONGITUDE: 122W(-122)
             LATITUDE : 36.8N
                           1      10     20     40     60     80    100    150    200    250    300
                            1      2      3      4      5      6      7      8      9     10     11
 27-OCT-2010 21:30 /  1:  14.09  13.60   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 22:30 /  2:  14.17  13.62   ....   ....   ....   ....   ....   ....   ....   ....   ....
 27-OCT-2010 23:30 /  3:  14.34  13.63   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 00:30 /  4:  14.28  13.69   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 01:30 /  5:  14.22  13.72   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 02:30 /  6:  14.21  13.78   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 03:30 /  7:  14.21  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 04:30 /  8:  14.09  13.79   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 05:30 /  9:  14.01  13.77   ....   ....   ....   ....   ....   ....   ....   ....   ....
 28-OCT-2010 06:30 / 10:  13.89  13.76   ....   ....   ....   ....   ....   ....   ....   ....   ....
yes?

{noformat}
O.K.\!  That looks good.  The 10m data got written.  Now to fix it for production.  This deployment was a special case where the 1m data start after the 10m data.  Typically, it's most convenient to have all of the microcats have the same deployment start time.  This makes the follow on data processing much simpler.

All of the deployment start times in SSDS_METADTA for the M1 201010 deployment were adjusted to be the same as the start time for the Mooring deployment.  Performing this step is now part of the [standard operating procedure for performing mooring turns|SSDS:OASIS Mooring turn]. Once SSDS_METADATA has been updated the individual instrument netCDF files must be created by DStoNetCDF.pl before combineTS.pl in run.

h4. D. Examining the gridding method

There are still some problems with gappy data at 40m and below in the \_TS file.  To debug these we'll make another copy of the OS_MBARI-M1_20101027_R_TS.jnl to /tmp and edit it to go through the processing of the 40m data saving the data to a netCDF file in /tmp so as not to disturb the production processing.  We also comment out all of the "CANCEL DATA 1" statements so that we can examine data from the files. This file is executed and we see no errors.  We need to examine the input data and the Ferret variables that are constructed for the gridding.  Here are the commands from the .jnl that perform the the gridding for the 40m data:
{noformat}
!
! Remove temperature outliers before gridding
!
LET Temperature_QFLAG = IF Temperature GT 2 AND Temperature LT 20 THEN 1 ELSE (-99999)
SET VAR/BAD=-99999 Temperature_QFLAG
LET Temperature_QC = Temperature_QFLAG * Temperature
!
! Compute my own mean of the data, making sure to assign missing values in the gaps in the Gap FLAG
! Allow at least 1 data point in each destination cell - there are usually 6 for 10 minute data
!
LET Temperature_GOOD = Temperature_QC[gt=TIME@SUM] / Temperature_QC[gt=TIME@NGD]
LET Temperature_GFLAG = IF Temperature[gt=TIME@NGD,gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE] LT 1 THEN (-99999) ELSE 1
SET VAR/BAD=-99999 Temperature_GFLAG
LET TEMP = Temperature_GFLAG * Temperature_GOOD[gz=DEPTH@XACT,gy=LATITUDE,gx=LONGITUDE]

{noformat}
Here are some sample Ferret commands for plotting these data from the session that just executed the OS_MBARI-M1_20101027_R_TS.jnl script:
{noformat}
yes? go "OS_MBARI-M1_20101027_R_TS.jnl"
<snip>
yes? set region/t=1-may-2011:1-jun-2011
yes? plot Temperature_QC
yes? plot/ov/symbol=1 temperature
yes? set win 2
yes? plot Temperature_QC[gt=TIME@NGD]
yes? plot TEMPERATURE_QC[GT=TIME@SUM]

{noformat}
These last two plot commands indicate the source of the problem of the gappy data from the inductive modem microcats. Another big clue is the comment in the .jnl file referring to the 10-minute input data and having at least 6 good values within each gridding cell. As can be seen in the plot we often have less than 1 for the @NGD value for the 40m data. These data are hourly and we should be using a different gridding algorithm for them.
!m1_ngd_sum.gif|thumbnail!

The October 2010 M1 deployment was the first one where all the inductive modem connected CTDs were logged as separate instruments, and the first deployment where the serial microcat processing software was used to process the inductive modem microcat data.  The fix for this problem appears to be to do a different gridding for the hourly data from 40m and below. This change was implemented in the code on 2 June 2011 using the Ferret same gridding transform (@MAX) that was previously used for the inductive modem data processing.&nbsp; Here is the after figure:

 !wind_SEA_WATER_TEMPERATURE_HR_last30_after.gif|thumbnail!
The subsurface data looks a lot better, but there are still some gaps.&nbsp; If the gaps extend across the whole water column encompassing both the inductive modem and serial microcats then perhaps the gap is due to an interruption in data processing through oasisToSSDS.&nbsp; This can be remedied by reprocessing the telemetered data by following the README instructions in /u/ssdsadmin/dev/DPforSSDS/oasis/scripts on elvis.

h4. E. Testing the results of the gridding

It is worthwhile to do another check on the quality of the gridding that is now being performed.&nbsp; The following Ferret exercice will show the input data compared to the gridded data.
{noformat}
USE "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/OS_M1_20101027hourly_CMSTV.nc"
SET REGION/T="29-May-2011 18:13":"02-Jun-2011 18:13"
shade SEA_WATER_TEMPERATURE_HR
set win 2
plot/k=1/vlimits=7:13 SEA_WATER_TEMPERATURE_HR
repeat/k=2:11 plot/ov SEA_WATER_TEMPERATURE_HR

{noformat}
Produces these images showing missing data, especially from the 20m and 40m microcats:

 !m1_shade.gif|thumbnail!

 !m1_lines.gif|thumbnail!

Let's compare the original instruments date from 20m and 40m to the gridded product, using the same Ferret session from above:"
{noformat}
use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0020_20101027_original.nc"
plot/symbol=1 temperature[d=2]
plot/ov SEA_WATER_TEMPERATURE_HR[k=3,d=1]

use "http://dods.mbari.org/opendap/data/ssdsdata/deployments/m1/201010/m1_ctd0040_20101027_original.nc"
plot/symbol=1 temperature[d=3]
plot/ov SEA_WATER_TEMPERATURE_HR[k=4,d=1]

{noformat}
Gives:

 !m1_compare_20.gif|thumbnail!

 !m1_compare_40.gif|thumbnail!

We obviously still have some gridding issues...

h4. F. Rinse and repeat


Now is the time to iterate using our method of starting with the .jnl file that aggregates and grids the data to the OceanSITES \_TS.nc file going back to step D.
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">18579772</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">670</id>
<property name="body"><![CDATA[Mintues from SSDS (or related) Meetings:

h5. Weekly Meetings

# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">673</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">674</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
## AUVCTD
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
## OASIS
## CIMT
## AUVCTD
## Data Aggregation
## SENSORS
## UW to Microsoft Proposal
## UCSD Response to CI IO
## MBARI Response to CI IO
## LOOKING
## AOSN
## SNMP
## NOAA Proposal
## Nekton Research
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website (?)
# What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">677</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">673</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
## AUVCTD
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS, their status, and how SSDS contributes
## MOOS/MSE
## OASIS
## CIMT
## AUVCTD
## Data Aggregation
## SENSORS
## UW to Microsoft Proposal
## UCSD Response to CI IO
## MBARI Response to CI IO
## LOOKING
## AOSN
## SNMP
## NOAA Proposal
## Nekton Research
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Internally
## Externally
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website
# What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">676</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">672</id>
<property name="body"><![CDATA[h2. Agenda

# Current SSDS Status
## MSE
## M1/M2
## CIMT
## AUVCTD
# Documentation (WIKI migration)
# To dos in JIRA
# Projects involving SSDS and their status
## MOOS/MSE
## OASIS
## CIMT
## AUVCTD
## Data Aggregation
## SENSORS
## UW to Microsoft Proposal
## UCSD Response to CI IO
## MBARI Response to CI IO
## LOOKING
## AOSN
## SNMP
## NOAA Proposal
## Nekton Research
## CenCOOS (?)
## Dalhousie (?)
# What are our goals for SSDS?
## Short Term
## Long Term
# How do we transition to support and what still needs to be done?
# How do we best open source SSDS?
## Current licensing website
# What is still to be done to open source?]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">675</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829828</id>
<property name="body"><![CDATA[Initial teleconference with ALOHA Observatory Group:

h5. Attendees:
# MBARI
## Kevin Gomes
## Duane Edgington
## Bob Herlien
# ALOHA
## Fernando Santiago-Mandujano
## Paul Lethaby
## Jeffrey Schneider

Other contacts:
# Pat Thompson (I.T. Support for SSDS machine)
# MARS Team (ALOHA group was interested in contacting MARS team through Etch)

h5. Notes:
# Deployment on ALOHA Cabled Observatory
# Early January 2011
# Instruments:
## SBE37s (two of them)
## Array of thermistor SBE39s (10 of them inductively)
## ADCP (Sontek 250kHz), probably be getting an RDI deep water monitor
## BB2F 
## Two hydrophones (probably not managed through SIAM and SSDS)
## One video camera (not defined), assume video servers (probably not managed through SIAM and SSDS).
# They connect instruments to serial port terminal server (digi 4 port server).
# The deployment will be at 5000m depth
# They would like to use SSDS to do data management
# Would like to use SIAM to communicate with sensors.
# DataTurbine is of interest to the ALOHA guys and they would use it.
# They do not have PUCKs on their instruments, we said no problem.
# They are interested in Adaptive Sampling (automated)
# They were interested in documentation for SIAM and its integration with DataTurbine
# Sample rates for instruments on average around once a minute (or a little less).

h5. Timeline:
More details to come from ALOHA group, but some timeline notes:
# Ship time is January
# They want test system in lab ASAP (they actually have some of it running currently)

h5. Action Items:
# Kevin will look back and try to get SSDS install going again on kainani.
# ALOHA group will send Bob information about instruments (IP addresses, etc.)
# Bob will look into getting SIAM running against their instruments.
# ALOHA group will work on generating a timeline with milestones like code freeze, integration and test, etc.

NOTE: As long as the time is not huge, we can charge to TTOS.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797075</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17891618</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [SPEPRJ:Installing RabbitMQ (AMQP) on RHEL5]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]
# [Debugging quick look and contour wind stick plots]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17858875</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829830</id>
<property name="body"><![CDATA[Initial teleconference with ALOHA Observatory Group:

h5. Attendees:
# MBARI
## Kevin Gomes
## Duane Edgington
## Bob Herlien
# ALOHA
## Fernando Santiago-Mandujano
## Paul Lethaby
## Jeffrey Schneider

Other contacts:
# Pat Thompson (I.T. Support for SSDS machine)
# MARS Team (ALOHA group was interested in contacting MARS team through Etch)

h5. Notes:
# Deployment on ALOHA Cabled Observatory
# Early January 2011
# Instruments:
## SBE37s (two of them)
## Array of thermistor SBE39s (10 of them inductively)
## ADCP (Sontek 250kHz), probably be getting an RDI deep water monitor
## BB2F 
## Two hydrophones (probably not managed through SIAM and SSDS)
## One video camera (not defined), assume video servers (probably not managed through SIAM and SSDS).
# They connect instruments to serial port terminal server (digi 4 port server).
# The deployment will be at 5000m depth
# They would like to use SSDS to do data management
# Would like to use SIAM to communicate with sensors.
# DataTurbine is of interest to the ALOHA guys and they would use it.
# They do not have PUCKs on their instruments, we said no problem.
# They are interested in Adaptive Sampling (automated)
# They were interested in documentation for SIAM and its integration with DataTurbine
# Sample rates for instruments on average around once a minute (or a little less).
# Bob (for SIAM) and Kevin (for SSDS) will be the points of contacts for MBARI<->ALOHA interactions.

h5. Timeline:
More details to come from ALOHA group, but some timeline notes:
# Ship time is January
# They want test system in lab ASAP (they actually have some of it running currently)

h5. Action Items:
# Kevin will look back and try to get SSDS install going again on kainani.
# ALOHA group will send Bob information about instruments (IP addresses, etc.)
# Bob will look into getting SIAM running against their instruments.
# ALOHA group will work on generating a timeline with milestones like code freeze, integration and test, etc.

NOTE: As long as the time is not huge, we can charge to TTOS.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797077</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829831</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797078</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">17891622</id>
<property name="body"><![CDATA[In July of 2011, the database server that SSDS was running against was a an older version of SQL Server (2000) and SSDS was filling up the disk on Solstice.  For this reason, it was decided to create a whole new server in the DMZ running SQL 2008 and to move the SSDS databases to that machine.  Here are the steps taken during that work:

# 7:41 AM: SSH'd into pismo as kgomes
# 7:44 AM: edited the crontab using 'crontab -e' and commented out the entries that ran the data checker and the graphing routines.
# 7:45 AM: Verified the updatebot was runnning using 'ps -ef'
{noformat}
root      4203     1  0 Jul07 ?        00:00:15 /usr/java/jdk1.6.0_06/bin/java -Duser.timezone=UTC -Xms512m -Xmx1024m -classpath /opt/ssds/updatebot/ssds-updatebot-client-new-ssds.jar moos.ssds.clients.updateBot.UpdateBotRunner
{noformat}
# 7:45 AM: stopped the updatebot service using 'sudo /sbin/service updatebot stop'
# 7:49 AM: ssh'd into new-ssds.mbari.org as kgomes
# 7:50 AM: in another windows, ssh'd into bob.shore.mbari.org as kgomes
# 7:50 AM: verified JBoss was running on bob, using 'ps -aux' and getting:
{noformat}
root   11926   0.4 -4.8  1325572 100336  ??  S    27Jun11 1313:48.61 /usr/bin/java -server -Xmx1024M -Djboss.server.temp.dir=/var/tmp/jbosstmpdata11922 -classpath /Library/JBoss/3.2/bin/run.jar org.jboss.Main -c deploy-standalone
{noformat}
# 7:50 AM: on bob.shore.mbari.org, shut off the JBoss instance using:
{noformat}
sudo serveradmin stop appserver
{noformat}
# 7:54 AM: could not shutdown JBoss on new-ssds.mbari.org using 'sudo /sbin/service jboss stop' and figured out that I had to use:
{noformat}
cd /opt/jboss/bin
./shutdown.sh -S -s 134.89.2.25
{noformat}
# 8:16 AM: bob.shore.mbari.org had some oddities with iagadmin account, so I rebooted bob remotely using
{noformat}
sudo shutdown -r now
{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">17858879</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945689</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://localhost:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912922</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">841</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below).  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">844</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">837</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">840</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">848</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below) or set an environment variable name SSDS_BUILD_NAME and that will automatically set the ant property "name".  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.
** *NOTE* In the _myserver_-build.properties (or default-build.properties if you edited those) you will need to set the 
# Setup a HTTP server on the server where SSDS will be deployed an mount the directory where the content.deployment.location pointed to.  This will make all SSDS generated content available through an HTTP server.  For example, if the content.deployment.location property was set to /data/ssds, then create a symbolic link to that directory under the htdocs in your apache and open it up for reading.
# Similarly, you will want to setup a DODS server to point to that directory as well.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">851</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">847</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below).  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.
** *NOTE* In the _myserver_-build.properties (or default-build.properties if you edited those) you will need to set the 
# Setup a HTTP server on the server where SSDS will be deployed an mount the directory where the content.deployment.location pointed to.  This will make all SSDS generated content available through an HTTP server.  For example, if the content.deployment.location property was set to /data/ssds, then create a symbolic link to that directory under the htdocs in your apache and open it up for reading.
# Similarly, you will want to setup a DODS server to point to that directory as well.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">850</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">844</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below).  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">847</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945692</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  
{panel:title=createDuplicateDeepDeployment}
h5. Background
The purpose of this service was to have a way to make copies of deployments in SSDS.  Often times we want to duplicate an instance of a deployment, but we want to copy all of its sub-deployment children as well, hence the "deep" part of the copy. This method takes in a <code>DataProducer</code> that must be of type "deployment" and then creates "deep" copy of it and persists the new copy. It pulls in the options specified in the incoming parameters to create a unique copy of the DataProducers and DataContainer (outputs). All the rest of the object should be linked to the ones that already exist in the peristent storage. The new ID of the duplicate deployment is returned. 

h5. The Interface
||Return||Parameters||
|The ID of the newly generated deployment|* DataProducer to Copy
* Date the copy should start at
* A boolean to indicate if the old (original) should be closed
* Date the old (original) should use as an end date (if to be closed)
* String that will be the name of the new deployment (copy)
* String that is the base of the data stream URI which should be {code}http://new-ssds.mbari.org/servlet/GetOriginalDataServlet{code}|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long createDuplicateDeepDeployment(
        DataProducer deploymentToCopy,          // DataProducer to copy
        Date newStartDate,                      // Date to start copied DataProducer on
        boolean closeOld,                       // Whether or not old (original) should be closed
        Date oldEndDate,                        // Date to use for end date if original is closed
        String newHeadDeploymentName,           // Name of the new DataProducer (copy)
        String baseDataStreamUri                // Base URI for raw data access (http://new-ssds.mbari.org/servlet/GetOriginalDataServlet)
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=createDuplicateDeepDeployment
&p1Type=DataProducer&p1Value=DataProducer|id=1938292
&p2Type=Date&p2Value=2008-12-01T00:00:00Z
&p3Type=boolean&p3Value=true
&p4Type=Date&p4Value=2008-11-30T00:00:00Z
&p5Type=String&p5Value=New copy of Deployment
&p6Type=String&p6Value=http://new-ssds.mbari.org/servlet/GetOriginalDataServlet
{code}
And the return might looks something like this:
{code}
java.lang.Long=4552323
{code}
h5. Web Services client
Under construction
{panel}

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912925</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">846</id>
<property name="body"><![CDATA[In order to build the SSDS system, you must perform the following steps:

# Check SSDS out of source control (cvs, but moving to subversion).
# Install j2SE 5.
# Download and install JBoss 4.0.3SP1
# Set and environment variable named JBOSS_HOME and point to the root of the JBoss installation.  This is where the SSDS build will deploy all of the SSDS components.
# Create two databases on a database server of choice.  Database one should be called 'SSDS_Data' and the other should be 'SSDS_Metadata'. 
# Create a user in the database that has full permissions on both databases (it has to be able to create and drop tables) and assign a password to that user. (NOTE: Make sure you have this information as you will need it when you are editing properties later.
# Configure the properties for the build.  To do this, you will need to do one of two things.  In the directory src/resources/build/configurations there is a file called default-build.properties.  This file contains the properties that are necessary for the build to compile, package and deploy SSDS to a JBoss installation.  You can either edit this file directly (but do NOT check back into source control), or you can create a copy of the file and name it _myserver_-build.properties.  This is recommended as it will simplify source control if you are developing SSDS code.  If you do make a copy, you will have to specify a "name" property when you run the ant build (specified below).  If you do edit the default-build.properties file, make sure you change all the places where REPLACE is specified.  The build will check to make sure you got them all, but you will need to catch them all.
** *NOTE* In the _myserver_-build.properties (or default-build.properties if you edited those) you will need to set the 
# Setup a HTTP server on the server where SSDS will be deployed an mount the directory where the content.deployment.location pointed to.  This will make all SSDS generated content available through an HTTP server.  For example, if the content.deployment.location property was set to /data/ssds, then create a symbolic link to that directory under the htdocs in your apache and open it up for reading.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">849</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945769</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reason (security for the SSL case).  These instructions were performed on a Solaris installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Subversion (TODO: kgomes, more information here when we get open source repository configured).
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913006</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389148</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-cpp-0.5.tar.gz)
# Unzipped the file.
# Untarred the file.
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# To get help2man, I downloaded the tar.gz from here: [http://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]
# Unzipped the file
{noformat}
gunzip help2man-1.36.4.tar.gz
{noformat}
# Untarred it
{noformat}
tar -xvf help2man-1.36.4.tar
{noformat}
# I cd'd into cp]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356436</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945773</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913010</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945777</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Add JBoss jars
## ${jboss.home}/client/activation.jar
## ${jboss.home}/client/servlet-api.jar
## ${jboss.home}/client/jboss-j2ee.jar
## ${jboss.home}/client/log4j.jar
## ${jboss.home}/server/default/lib/commons-codec.jar
## ${jboss.home}/server/default/lib/commons-collections.jar
## ${jboss.home}/server/default/lib/commons-httpclient.jar
## ${jboss.home}/server/default/lib/hibernate3.jar
## ${jboss.home}/server/default/lib/mail.jar

# Add Flex Jars

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913014</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945775</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Add JBoss jars
# Add Flex Jars

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913012</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389123</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356411</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945782</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913019</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945779</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar

# Add Flex Jars

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913016</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945780</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar

# Add Flex Jars

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913017</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389127</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

1. Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-cpp-0.5.tar.gz)
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356415</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389129</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

1. Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-cpp-0.5.tar.gz)
2. Unzipped the file.
3. Untarred the file.
4. I decided to run the C++ broker and so I needed to build it.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356417</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389132</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-cpp-0.5.tar.gz)
# Unzipped the file.
# Untarred the file.
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# I cd'd into cp]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356420</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945790</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913027</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945792</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913029</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945736</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  
{panel:title=createDuplicateDeepDeployment}
h5. Background
The purpose of this service was to have a way to make copies of deployments in SSDS.  Often times we want to duplicate an instance of a deployment, but we want to copy all of its sub-deployment children as well, hence the "deep" part of the copy. This method takes in a <code>DataProducer</code> that must be of type "deployment" and then creates "deep" copy of it and persists the new copy. It pulls in the options specified in the incoming parameters to create a unique copy of the DataProducers and DataContainer (outputs). All the rest of the object should be linked to the ones that already exist in the peristent storage. The new ID of the duplicate deployment is returned. 

h5. The Interface
||Return||Parameters||
|The ID of the newly generated deployment|* DataProducer to Copy
* Date the copy should start at
* A boolean to indicate if the old (original) should be closed
* Date the old (original) should use as an end date (if to be closed)
* String that will be the name of the new deployment (copy)
* String that is the base of the data stream URI which should be {code}http://new-ssds.mbari.org/servlet/GetOriginalDataServlet{code}|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long createDuplicateDeepDeployment(
        DataProducer deploymentToCopy,          // DataProducer to copy
        Date newStartDate,                      // Date to start copied DataProducer on
        boolean closeOld,                       // Whether or not old (original) should be closed
        Date oldEndDate,                        // Date to use for end date if original is closed
        String newHeadDeploymentName,           // Name of the new DataProducer (copy)
        String baseDataStreamUri                // Base URI for raw data access (http://new-ssds.mbari.org/servlet/GetOriginalDataServlet)
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=createDuplicateDeepDeployment
&p1Type=DataProducer&p1Value=DataProducer|id=1938292
&p2Type=Date&p2Value=2008-12-01T00:00:00Z
&p3Type=boolean&p3Value=true
&p4Type=Date&p4Value=2008-11-30T00:00:00Z
&p5Type=String&p5Value=New copy of Deployment
&p6Type=String&p6Value=http://new-ssds.mbari.org/servlet/GetOriginalDataServlet
{code}
And the return might looks something like this:
{code}
Result(s):
java.lang.Long|29985
{code}
h5. Web Services client
Under construction
{panel}

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912972</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829813</id>
<property name="body"><![CDATA[In order to make sure I can move the production application to the Google code base, I need to go through each .java file and make sure I have tests and documentation written for each one.  Here is the listing of all the .java files currently in the SSDS code base:

|| Package || File ||
| moos.ssds.clients.graphing | DeviceQCPlotCreator.java |
| moos.ssds.clients.ssdsLoads | FileParser.java |
| moos.ssds.clients.ssdsLoads | SubmitFiles.java |
| moos.ssds.clients.updateBot | UpdateBot.java |
| moos.ssds.clients.updateBot | UpdateBotListener.java |
| moos.ssds.clients.updateBot | UpdateBotRunner.java |
| moos.ssds.dao | DataContainerDAO.java |
| moos.ssds.dao | DataContainerGroupDAO.java |
| moos.ssds.dao | DataProducerDAO.java |
| moos.ssds.dao | DataProducerGroupDAO.java |
| moos.ssds.dao | DeviceDAO.java |
| moos.ssds.dao | DeviceTypeDAO.java |
| moos.ssds.dao | EventDAO.java |
| moos.ssds.dao | HeaderDescriptionDAO.java |
| moos.ssds.dao | IMetadataDAO.java |
| moos.ssds.dao | KeywordDAO.java |
| moos.ssds.dao | MetadataDAO.java |
| moos.ssds.dao | PersonDAO.java |
| moos.ssds.dao | RecordDescriptionDAO.java |
| moos.ssds.dao | RecordVariableDAO.java |
| moos.ssds.dao | ResourceDAO.java |
| moos.ssds.dao | ResourceTypeDAO.java |
| moos.ssds.dao | SoftwareDAO.java |
| moos.ssds.dao | StandardDomainDAO.java |
| moos.ssds.dao | StandardKeywordDAO.java |
| moos.ssds.dao | StandardReferenceScaleDAO.java |
| moos.ssds.dao | StandardUnitDAO.java |
| moos.ssds.dao | StandardVariableDAO.java |
| moos.ssds.dao | UserGroupDAO.java |
| moos.ssds.dao.util | MetadataAccessException.java |
| moos.ssds.data.converters | NetcdfConverter.java |
| moos.ssds.data.graphing | AnchorDrawer.java |
| moos.ssds.data.graphing | ColorBarBugFix.java |
| moos.ssds.data.graphing | DegreesMinutesNumberFormat.java |
| moos.ssds.data.graphing | DistanceScaleDrawer.java |
| moos.ssds.data.graphing | GpsCharter.java |
| moos.ssds.data.graphing | LatLonConverter.java |
| moos.ssds.data.graphing | LocationAndTimeDataset.java |
| moos.ssds.data.graphing | WatchCircleDrawer.java |
| moos.ssds.data.graphing | XYCircleRenderer.java |
| moos.ssds.data.graphing | XYPlotWithColorBar.java |
| moos.ssds.data | IDataAccess.java |
| moos.ssds.data | ITimeIndexedDataAccess.java |
| moos.ssds.data.parsers | AsciiFileContext.java |
| moos.ssds.data.parsers | AsciiFixedWidthParser.java |
| moos.ssds.data.parsers | AsciiPacketParser.java |
| moos.ssds.data.parsers | AsciiRecordParser.java |
| moos.ssds.data.parsers | BinaryFileContext.java |
| moos.ssds.data.parsers | BinaryPacketParser.java |
| moos.ssds.data.parsers | BinaryRecordParser.java |
| moos.ssds.data.parsers | IParser.java |
| moos.ssds.data.parsers | MultipartMimeFileContext.java |
| moos.ssds.data.parsers | Nmea21PacketParser.java |
| moos.ssds.data.parsers | Nmea21RecordParser.java |
| moos.ssds.data.parsers | PacketParser.java |
| moos.ssds.data.parsers | PacketParserContext.java |
| moos.ssds.data.parsers | Parser.java |
| moos.ssds.data.parsers | ParserContext.java |
| moos.ssds.data.parsers | ParsingException.java |
| moos.ssds.data.parsers | RecordParser.java |
| moos.ssds.data.parsers | VariableFormatMap.java |
| moos.ssds.data | TimeIndexedDataAccessFactory.java |
| moos.ssds.data | TimeIndexedFreeFormAccess.java |
| moos.ssds.data | TimeIndexedNetcdfAccess.java |
| moos.ssds.data | TimeIndexedPacketAccess.java |
| moos.ssds.data.util | DataException.java |
| moos.ssds.data.util | LocationAndTime.java |
| moos.ssds.ingest | IngestMDB.java |
| moos.ssds.ingest | SQLIngestMDB.java |
| moos.ssds.io | PacketInput.java |
| moos.ssds.io | PacketOutput.java |
| moos.ssds.io | PacketOutputManager.java |
| moos.ssds.io | PacketSQLInput.java |
| moos.ssds.io | PacketSQLOutput.java |
| moos.ssds.io.util | Base64.java |
| moos.ssds.io.util | CountInputStream.java |
| moos.ssds.io.util | PacketMerger.java |
| moos.ssds.jms | PublisherComponent.java |
| moos.ssds.jms | SubscriberComponent.java |
| moos.ssds.metadata | CommentTag.java |
| moos.ssds.metadata | DataContainer.java |
| moos.ssds.metadata | DataContainerGroup.java |
| moos.ssds.metadata | DataProducer.java |
| moos.ssds.metadata | DataProducerGroup.java |
| moos.ssds.metadata | DateRange.java |
| moos.ssds.metadata | Device.java |
| moos.ssds.metadata | DeviceType.java |
| moos.ssds.metadata | Event.java |
| moos.ssds.metadata | HeaderDescription.java |
| moos.ssds.metadata | IDateRange.java |
| moos.ssds.metadata | IDescription.java |
| moos.ssds.metadata | IMetadataObject.java |
| moos.ssds.metadata | IResourceOwner.java |
| moos.ssds.metadata | Keyword.java |
| moos.ssds.metadata | Person.java |
| moos.ssds.metadata | RecordDescription.java |
| moos.ssds.metadata | RecordVariable.java |
| moos.ssds.metadata | Resource.java |
| moos.ssds.metadata | ResourceBLOB.java |
| moos.ssds.metadata | ResourceType.java |
| moos.ssds.metadata | Software.java |
| moos.ssds.metadata | StandardDomain.java |
| moos.ssds.metadata | StandardKeyword.java |
| moos.ssds.metadata | StandardReferenceScale.java |
| moos.ssds.metadata | StandardUnit.java |
| moos.ssds.metadata | StandardVariable.java |
| moos.ssds.metadata | UserGroup.java |
| moos.ssds.metadata.util | MetadataException.java |
| moos.ssds.metadata.util | MetadataFactory.java |
| moos.ssds.metadata.util | MetadataValidator.java |
| moos.ssds.metadata.util | ObjectBuilder.java |
| moos.ssds.metadata.util | XmlBuilder.java |
| moos.ssds.ruminate | Handler.java |
| moos.ssds.ruminate | MetadataHandler.java |
| moos.ssds.ruminate | RuminateMDB.java |
| moos.ssds.ruminate | XMLMetadataTracker.java |
| moos.ssds.services.blazeds | EJBFactory.java |
| moos.ssds.services.blazeds | IResourceLocator.java |
| moos.ssds.services.blazeds | LocalCachingJNDIResourceLocator.java |
| moos.ssds.services.blazeds | LocalJNDIResourceLocator.java |
| moos.ssds.services.blazeds | ResourceException.java |
| moos.ssds.services.blazeds | SessionRO.java |
| moos.ssds.services.data | DeviceDataAccessEJB.java |
| moos.ssds.services.data.graphing | GeospatialGraphingAccessEJB.java |
| moos.ssds.services.data | PacketFileToSQLServicePublisher.java |
| moos.ssds.services.data | PacketSubmissionAccessEJB.java |
| moos.ssds.services.data | RecordVariableDataAccessEJB.java |
| moos.ssds.services.data | SQLDataStreamRawDataAccessEJB.java |
| moos.ssds.services.data.util | DataException.java |
| moos.ssds.services.metadata | AccessBean.java |
| moos.ssds.services.metadata | DataContainerAccessEJB.java |
| moos.ssds.services.metadata | DataContainerGroupAccessEJB.java |
| moos.ssds.services.metadata | DataProducerAccessEJB.java |
| moos.ssds.services.metadata | DataProducerGroupAccessEJB.java |
| moos.ssds.services.metadata | DeviceAccessEJB.java |
| moos.ssds.services.metadata | DeviceTypeAccessEJB.java |
| moos.ssds.services.metadata | EventAccessEJB.java |
| moos.ssds.services.metadata | IMetadataAccess.java |
| moos.ssds.services.metadata | IMetadataAccessRemote.java |
| moos.ssds.services.metadata | KeywordAccessEJB.java |
| moos.ssds.services.metadata | PersonAccessEJB.java |
| moos.ssds.services.metadata | RecordVariableAccessEJB.java |
| moos.ssds.services.metadata | ResourceAccessEJB.java |
| moos.ssds.services.metadata | ResourceTypeAccessEJB.java |
| moos.ssds.services.metadata | SoftwareAccessEJB.java |
| moos.ssds.services.metadata | StandardDomainAccessEJB.java |
| moos.ssds.services.metadata | StandardKeywordAccessEJB.java |
| moos.ssds.services.metadata | StandardReferenceScaleAccessEJB.java |
| moos.ssds.services.metadata | StandardUnitAccessEJB.java |
| moos.ssds.services.metadata | StandardVariableAccessEJB.java |
| moos.ssds.services.metadata | UserGroupAccessEJB.java |
| moos.ssds.services.servlet.ajax | GoogleMapsGPSDataServlet.java |
| moos.ssds.services.servlet.data | DataAccessServlet.java |
| moos.ssds.services.servlet.data | GetOriginalDataServlet.java |
| moos.ssds.services.servlet.metadata | MetadataAccessServlet.java |
| moos.ssds.services.servlet.metadata | SensorMLConverterServlet.java |
| moos.ssds.services.servlet.util | MethodProxy.java |
| moos.ssds.services.servlet.util | ServletFaultHandler.java |
| moos.ssds.services.servlet.util | ServletUtils.java |
| moos.ssds.simulator | DataPacket.java |
| moos.ssds.simulator | FileInfo.java |
| moos.ssds.simulator | PacketGenerator.java |
| moos.ssds.transmogrify | SIAMMetadataTracker.java |
| moos.ssds.transmogrify | SSDSDevicePacket.java |
| moos.ssds.transmogrify | SSDSGeoLocatedDevicePacket.java |
| moos.ssds.transmogrify | TransmogrifyMDB.java |
| moos.ssds.util | DateUtils.java |
| moos.ssds.util | XmlDateFormat.java |
| moos.ssds.wrapper.ogc.sensorml | SensorMLFactory.java |
| moos.ssds.wrappergenerator | Method.java |
| moos.ssds.wrappergenerator | MyClass.java |
| moos.ssds.wrappergenerator | Parameter.java |
| moos.ssds.wrappergenerator.parser | JavaLexer.java |
| moos.ssds.wrappergenerator.parser | JavaRecognizer.java |
| moos.ssds.wrappergenerator.parser | JavaTokenTypes.java |
| moos.ssds.wrappergenerator.parser | JavaTreeParser.java |
| moos.ssds.wrappergenerator.parser | JavaTreeParserTokenTypes.java |
| moos.ssds.wrappergenerator | PerlGenerator.java |
| moos.ssds.wrappergenerator | TranslationController.java |
| moos.ssds.wrappergenerator | TranslationGenerator.java |
| org.mbari.io | FilterCommentInputStream.java |
| org.mbari.io | URLDataBuffer.java |
| org.mbari.util | Email.java |
| org.mbari.util | IsBinary.java |
| org.mbari.util | MathUtil.java |
| org.mbari.util | SwingDecorators.java |
| org.mbari.util | SwingWorker.java |
| org.mbari.util | SystemUtil.java |
| org.mbari.util | URLUTF8Encoder.java |
| test.moos.ssds.data.parsers | TestAsciiPacketParser.java |
| test.moos.ssds.data.parsers | TestAsciiRecordParser.java |
| test.moos.ssds.data.parsers | TestBinaryPacketParser.java |
| test.moos.ssds.data.parsers | TestBinaryRecordParser.java |
| test.moos.ssds.data.parsers | TestNmea21PacketParser.java |
| test.moos.ssds.data.parsers | TestNmea21RecordParser.java |
| test.moos.ssds.jms | IngestPubThread.java |
| test.moos.ssds.jms | TestIngest.java |
| test.moos.ssds.metadata | TestDataContainer.java |
| test.moos.ssds.metadata | TestDevice.java |
| test.moos.ssds.metadata | TestDeviceType.java |
| test.moos.ssds.metadata | TestPerson.java |
| test.moos.ssds.metadata | TestStandardUnit.java |
| test.moos.ssds.metadata | TestStandardVariable.java |
| test.moos.ssds.metadata.util | LoggingDifferenceListener.java |
| test.moos.ssds.metadata.util | SansSuperficialDifferenceListener.java |
| test.moos.ssds.metadata.util | TestMetadataFactory.java |
| test.moos.ssds.metadata.util | TestObjectBuilder.java |
| test.moos.ssds.metadata.util | TestXmlDateFormat.java |
| test.moos.ssds.ruminate | TestNetCDFWatchdog.java |
| test.moos.ssds.ruminate | TestRuminate.java |
| test.moos.ssds.services.data | TestDeviceDataAccess.java |
| test.moos.ssds.services.metadata | TestAccessCase.java |
| test.moos.ssds.services.metadata | TestDataContainerAccess.java |
| test.moos.ssds.services.metadata | TestDataProducerAccess.java |
| test.moos.ssds.services.metadata | TestDeviceAccess.java |
| test.moos.ssds.services.metadata | TestDeviceTypeAccess.java |
| test.moos.ssds.services.metadata | TestEventAccess.java |
| test.moos.ssds.services.metadata | TestPersonAccess.java |
| test.moos.ssds.services.metadata | TestRecordVariableAccess.java |
| test.moos.ssds.services.metadata | TestStandardUnitAccess.java |
| test.moos.ssds.services.metadata | TestStandardVariableAccess.java |
| test.moos.ssds.services.metadata | TestUserGroupAccess.java |
| test.moos.ssds.transmogrify | TransmogrifyMDBTest.java |
| test.moos.ssds.util | TestDateUtil.java |
| test.moos.ssds.wrapper.ogc.sensorml | TestSensorMLFactory.java |]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797060</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945738</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912974</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945737</id>
<property name="body"><![CDATA[]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912973</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945739</id>
<property name="body"><![CDATA[]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912975</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945742</id>
<property name="body"><![CDATA[This is the index page that lists all the various services in the SSDS and links to their respective documentation:

# [Data Producer Services]
## 
# [Data Services]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912978</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945741</id>
<property name="body"><![CDATA[These notes detail out the various designs of the different services for the SSDS.  

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912977</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829822</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797069</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945743</id>
<property name="body"><![CDATA[This is the index page that lists all the various services in the SSDS and links to their respective documentation:

# [Data Producer Services]
## createDuplicateDeepDeployment
# [Data Services]
## ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912979</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945745</id>
<property name="body"><![CDATA[{panel:title=createDuplicateDeepDeployment}
h5. Background
The purpose of this service was to have a way to make copies of deployments in SSDS.  Often times we want to duplicate an instance of a deployment, but we want to copy all of its sub-deployment children as well, hence the "deep" part of the copy. This method takes in a <code>DataProducer</code> that must be of type "deployment" and then creates "deep" copy of it and persists the new copy. It pulls in the options specified in the incoming parameters to create a unique copy of the DataProducers and DataContainer (outputs). All the rest of the object should be linked to the ones that already exist in the peristent storage. The new ID of the duplicate deployment is returned. 

h5. The Interface
||Return||Parameters||
|The ID of the newly generated deployment|* DataProducer to Copy
* Date the copy should start at
* A boolean to indicate if the old (original) should be closed
* Date the old (original) should use as an end date (if to be closed)
* String that will be the name of the new deployment (copy)
* String that is the base of the data stream URI which should be {code}http://new-ssds.mbari.org/servlet/GetOriginalDataServlet{code}|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long createDuplicateDeepDeployment(
        DataProducer deploymentToCopy,          // DataProducer to copy
        Date newStartDate,                      // Date to start copied DataProducer on
        boolean closeOld,                       // Whether or not old (original) should be closed
        Date oldEndDate,                        // Date to use for end date if original is closed
        String newHeadDeploymentName,           // Name of the new DataProducer (copy)
        String baseDataStreamUri                // Base URI for raw data access (http://new-ssds.mbari.org/servlet/GetOriginalDataServlet)
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=createDuplicateDeepDeployment
&p1Type=DataProducer&p1Value=DataProducer|id=1938292
&p2Type=Date&p2Value=2008-12-01T00:00:00Z
&p3Type=boolean&p3Value=true
&p4Type=Date&p4Value=2008-11-30T00:00:00Z
&p5Type=String&p5Value=New copy of Deployment
&p6Type=String&p6Value=http://new-ssds.mbari.org/servlet/GetOriginalDataServlet
{code}
And the return might looks something like this:
{code}
Result(s):
java.lang.Long|29985
{code}
h5. Web Services client
Under construction
{panel}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912981</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389158</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-0.5.tar.gz)
# Unzipped the file.
{noformat}
gunzip qpid-0.5.tar.gz
{noformat}
# Untarred the file.
{noformat}
tar -xvf qpid-0.5.tar
{noformat}
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# To get help2man, I downloaded the tar.gz from here: [http://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]
# Unzipped the file
{noformat}
gunzip help2man-1.36.4.tar.gz
{noformat}
# Untarred it
{noformat}
tar -xvf help2man-1.36.4.tar
{noformat}
# I then cd'd into that directory and ran
{noformat}
./configure --prefix=/root/Qpid/qpid-tools
{noformat}
which then died with:
{noformat}
configure: error: perl module Locale::gettext required
{noformat}
# ]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356446</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945747</id>
<property name="body"><![CDATA[This is the index page that lists all the various services in the SSDS and links to their respective documentation:

# [Data Producer Services]
## createDuplicateDeepDeployment
# [Data Services]
## getDataStreamProperties]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912983</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945749</id>
<property name="body"><![CDATA[{anchor:createDuplicateDeepDeployment}
{panel:title=createDuplicateDeepDeployment}
h5. Background
The purpose of this service was to have a way to make copies of deployments in SSDS.  Often times we want to duplicate an instance of a deployment, but we want to copy all of its sub-deployment children as well, hence the "deep" part of the copy. This method takes in a <code>DataProducer</code> that must be of type "deployment" and then creates "deep" copy of it and persists the new copy. It pulls in the options specified in the incoming parameters to create a unique copy of the DataProducers and DataContainer (outputs). All the rest of the object should be linked to the ones that already exist in the peristent storage. The new ID of the duplicate deployment is returned. 

h5. The Interface
||Return||Parameters||
|The ID of the newly generated deployment|* DataProducer to Copy
* Date the copy should start at
* A boolean to indicate if the old (original) should be closed
* Date the old (original) should use as an end date (if to be closed)
* String that will be the name of the new deployment (copy)
* String that is the base of the data stream URI which should be {code}http://new-ssds.mbari.org/servlet/GetOriginalDataServlet{code}|

So the API interface looks something like:
{code:title=createDuplicateDeepDeployment}
public Long createDuplicateDeepDeployment(
        DataProducer deploymentToCopy,          // DataProducer to copy
        Date newStartDate,                      // Date to start copied DataProducer on
        boolean closeOld,                       // Whether or not old (original) should be closed
        Date oldEndDate,                        // Date to use for end date if original is closed
        String newHeadDeploymentName,           // Name of the new DataProducer (copy)
        String baseDataStreamUri                // Base URI for raw data access (http://new-ssds.mbari.org/servlet/GetOriginalDataServlet)
)
{code}
h5. Java EJB client
Under construction

h5. REST Style client
To use this service via HTTP (REST Style), the call would be constructed using this format:
{code:title=REST Style format}
http://new-ssds.mbari.org/servlet/MetadataAccessServlet?objectToInvokeOn=DataProducerAccess&method=createDuplicateDeepDeployment
&p1Type=DataProducer&p1Value=DataProducer|id=1938292
&p2Type=Date&p2Value=2008-12-01T00:00:00Z
&p3Type=boolean&p3Value=true
&p4Type=Date&p4Value=2008-11-30T00:00:00Z
&p5Type=String&p5Value=New copy of Deployment
&p6Type=String&p6Value=http://new-ssds.mbari.org/servlet/GetOriginalDataServlet
{code}
And the return might looks something like this:
{code}
Result(s):
java.lang.Long|29985
{code}
h5. Web Services client
Under construction
{panel}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8912985</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389165</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-0.5.tar.gz)
# Unzipped the file.
{noformat}
gunzip qpid-0.5.tar.gz
{noformat}
# Untarred the file.
{noformat}
tar -xvf qpid-0.5.tar
{noformat}
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# To get help2man, I downloaded the tar.gz from here: [http://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]
# Unzipped the file
{noformat}
gunzip help2man-1.36.4.tar.gz
{noformat}
# Untarred it
{noformat}
tar -xvf help2man-1.36.4.tar
{noformat}
# I then cd'd into that directory and ran
{noformat}
./configure --prefix=/root/Qpid/qpid-tools
{noformat}
which then died with:
{noformat}
configure: error: perl module Locale::gettext required
{noformat}
# So, I installed the gettext-1.05.tar.gz perl module by downloading it, unzipping, unpacking, cd'ing into gettext-1.05 and running:
{noformat}
perl Makefile.PL
make
make test
make install
{noformat}
# Went back to the help2man directory and tried it again (it succeeded this time)
# Now run make
{noformat}
make install
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356453</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829807</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]

h5. Operational

# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797054</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389167</id>
<property name="body"><![CDATA[For the Qpid exploration, I setup a Red Hat Enterprise Linux machine.  I did all the following as root:

# Downloaded the Qpid tar.gz from http://qpid.apache.org/download.html (http://www.apache.org/dist/qpid/0.5/qpid-0.5.tar.gz)
# Unzipped the file.
{noformat}
gunzip qpid-0.5.tar.gz
{noformat}
# Untarred the file.
{noformat}
tar -xvf qpid-0.5.tar
{noformat}
# I decided to run the C++ broker and so I needed to build it.
# Before I could do that though, I had to have all the right packages to build, so I ran:
{noformat}
yum install boost-devel e2fsprogs-devel pkgconfig gcc-c++ make autoconf automake ruby libtool help2man doxygen graphviz
{noformat}
of which the help2man and graphviz were not available.
# To get help2man, I downloaded the tar.gz from here: [http://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz]
# Unzipped the file
{noformat}
gunzip help2man-1.36.4.tar.gz
{noformat}
# Untarred it
{noformat}
tar -xvf help2man-1.36.4.tar
{noformat}
# I then cd'd into that directory and ran
{noformat}
./configure --prefix=/root/Qpid/qpid-tools
{noformat}
which then died with:
{noformat}
configure: error: perl module Locale::gettext required
{noformat}
# So, I installed the gettext-1.05.tar.gz perl module by downloading it, unzipping, unpacking, cd'ing into gettext-1.05 and running:
{noformat}
perl Makefile.PL
make
make test
make install
{noformat}
# Went back to the help2man directory and tried it again (it succeeded this time)
# Now run make
{noformat}
make install
{noformat}
which seemed to work OK.
# Now for graphviz, I went to http://www.graphviz.org and downloaded the .rmp file and let RHEL open it with the package installer automatically.
# I clicked on 'Apply' and installed it OK.
# Because I wanted to explore using the clustering, I installed openais using yum by executing
{noformat}
yum install openais
{noformat}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356455</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389080</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

{note:title=Does not go through ingest}
Note that this process does not send a JMS packet through the normal ingest chain. If you are SSDS savy, this means it will skip the transmogrify-ingest-ruminate step and put this information directly in the database.
{note}
# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\

h2. Generate a packet from a file and publish to SSDS

For SIAM packet, you need the following information:
# StreamID (short)
# DevicePacketVersion (long)
# SourceID (long)
# Timestamp (long)
# SequenceNumber (long)
# MetadataRef(long)
# ParentID (long)
# RecordType (long)
# SecondStreamID (short)
# FirstBuffer (string that is name of file)
# SecondBuffer (string that is name of file)

For SSDS packet (ingest)

{noformat}
# This file contains the information that will be used to construct a data packet to publish to SSDS.

# This is the ID of the device that is the source of the packet (transmogrify & ingest)
SourceID=1000

# This is the ID of the parent that the device is connected to when it publishes
ParentID=999


{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356367</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389081</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

{note:title=Does not go through ingest}
Note that this process does not send a JMS packet through the normal ingest chain. If you are SSDS savy, this means it will skip the transmogrify-ingest-ruminate step and put this information directly in the database.
{note}
# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\

h2. Generate a packet from a file and publish to SSDS
{warning:title=Under Construction}
This section is still under construction, pay no attention
{warning}
# Download a jar file
# Create the properties file like the one here:
{noformat}
# This file contains the information that will be used to construct a data packet to publish to SSDS.

# This is a SIAM property that (in theory) would allow multiple message formats
# that can be handled.  Right now, there is only one and it should always be 0.
DevicePacketVersion=0

# This is the ID of the source of the data (i.e. the device that generated the packet
# being sent.
SourceID=1

# This is the timestamp on the packet which normally represents when the packet
# was created.  In the system it is normally epoch seconds, but for clarity sake,
# you can enter it in ISO 8601 format (http://en.wikipedia.org/wiki/ISO_8601)
Timestamp=2009-09-30T15:47:00Z

# This is the sequence number that will be on the packet. It should reflect the
# index in the order of generation of packets from the source device.
SequenceNumber=1

# This is the reference number that points to the sequence number of the packet
# which contains the metadata that describes the contents of this packet. 
MetadataRef=0

# This is the ID of the parent device (if one exists) that the generating device
# (see SourceID above) was connected to when it generated the packet
ParentID=0

# This is the type of record that is being produced.  Source devices can produce
# multiple types of records of the same type. For example, a device can produce
# data records in multiple formats.  This allows you to identify which format 
# is used for the generated packet.  It serves to link the pre-defined metadata
# to the packet and allows machines and humans to understand the contents of the
# packet.
RecordType=0

# This value determines what type of packet (SIAM equivalent) will be constructed
# using the information in this file.  The available options are:
# 1. METADATA
# 2. SENSOR_DATA
# 3. DEVICE_MESSAGE
SecondStreamID=METADATA

# This indicates which version of the above type of packet will be constructed.
# At the time of this authoring, the only option available is 0 for all three
# types listed above. In theory this would allow you to have multiple forms of
# any of the above types of packets, but it has not been used to date.
SecondPacketVersion=0

# This is the name of the file (located with this properties file) that contains
# the payload of the first buffer.  It will be read as straight bytes into a
# byte buffer. NOTE: with METADATA packets the first buffer contains something
# that is called 'cause' which is not used much by SSDS.
FirstBuffer=first-buffer.xml

# This is the name of the file (located with this properties file) that contains
# the payload of the second buffer.  It will be read as straight bytes into a
# byte buffer. NOTE: with METADATA packets the second buffer is usually where the
# main metadata is stored (for example, device XML).
SecondBuffer=second-buffer.txt
{noformat}
# Create the two buffer files
# Run using command:
{noformat}
the command
{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356368</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389078</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

{note:title=Does not go through ingest}
Note that this process does not send a JMS packet through the normal ingest chain. If you are SSDS savy, this means it will skip the transmogrify-ingest-ruminate step and put this information directly in the database.
{note}
# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\

h2. Generate a packet from a file and publish to SSDS

For SIAM packet (transmogrify), you need the following information:
# StreamID (short)
# DevicePacketVersion (long)
# SourceID (long)
# Timestamp (long)
# SequenceNumber (long)
# MetadataRef(long)
# ParentID (long)
# RecordType (long)
# SecondStreamID (short)
# FirstBufferLength (int)
# FirstBuffer (byte [])
# SecondBufferLength (int)
# SecondBuffer (byte [])

For SSDS packet (ingest)

{noformat}
# This file contains the information that will be used to construct a data packet to publish to SSDS.

# There are two points you can publish data to (transmogrify|ingest):
# 1. Transmogrify in the SIAM form (transmogrify)
# 2. Ingest in the SSDS form (ingest)
publish.location=transmogrify

# This is the ID of the device that is the source of the packet (transmogrify & ingest)
device.id=1000

# This is the ID of the parent that the device is connected to when it publishes
parent.id=999


{noformat}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356365</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389071</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356358</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389074</id>
<property name="body"><![CDATA[These are the instructions for putting non-SIAM infrastructure data streams into SSDS. There are two major steps for getting data into SSDS: Describing the data with metadata and Establishing a data publishing application.

h2. Describe the deployments and data with XML metadata

{note:title=Does not go through ingest}
Note that this process does not send a JMS packet through the normal ingest chain. If you are SSDS savy, this means it will skip the transmogrify-ingest-ruminate step and put this information directly in the database.
{note}
# Devices that are sensors (things that make measurements) and instruments (things that produce data) must first be entered into SSDS so that the metadata author can use the SSDS unique Device IDs in the XML metadata. This may be done with the newDevice.jsp application, specifically:&nbsp; [http://new-ssds.mbari.org:8080/ssds/faces/newDevice.jsp].
# Construct the XML describing the platform, instrument, and sensor deployment. Using an XML schema-aware tool such as Oxygen is recommended for producing well-formed and valid XML. Below is an example XML file (1696.xml) for the Test deployment of the Eye In The Sea platform. Important things to note:
## A Deployment with role="platform" must be the outer element.
## Give the platform Deployment an appropriate name - this will appear in the SSDS Explorer application and may be used to find the data in SSDS
## Other attributes (startTime, nominalDepth, nominalLatitute, nominalLongitude) may be added to the platform Deployment element, though they may be added later to the SSDS Metadata database
## Specify the bufferItemSeparator, recordTerminator, and recordParseRegExp in the instrument Deployment RecordDescription to enable automated parsing of the output
## Specify the RecordVariables (the minimal attributes are shown in this example)
{code}
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Header: /home/cvs/puckxml/1696.xml,v 1.4 2008/12/18 20:19:43 mccann Exp $	-->
<!-- Last edited by $Author: mccann $   -->
<Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ssds.mbari.org/xml/schema/SSDS_Metadata.xsd"
    majorVersion="1" minorVersion="2" lastAuthor="$Author: mccann $"
    lastUpdate="$Date: 2008/12/18 20:19:43 $">
    <Deployment role="platform" name="EITS on MARS (Test)">
        <Device id="1697"/>
        <!-- Eye In The Sea instrument for MARS2008 -->
        <Deployment role="instrument" name="Eye In The Sea combined data from the CTD and ADV">
            <Device id="1696"/>
            <Deployment role="sensor">
                <Device id="1694"/>
            </Deployment>
            <Deployment role="sensor">
                <Device id="1695"/>
            </Deployment>
            <output>
                <DataStream name="EITS Data Logger output of environmental data"
                    url="http://new-ssds.mbari.org:8080/servlet/GetOriginalDataServlet?deviceID=1696">
                    <RecordDescription bufferStyle="ASCII" bufferParseType="ordered"
                        bufferItemSeparator="whitespace" bufferLengthType="variable"
                        parseable="true" recordType="1" recordTerminator="\n"
                        recordParseRegExp="\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)">
                        <RecordVariable name="Temperature" longName="Water Temperature"
                            units="deg C" columnIndex="1" format="float">
                            <StandardVariable name="sea_water_temperature"/>
                        </RecordVariable>
                        <RecordVariable name="Salinity" longName="Salinity" units="psu"
                            columnIndex="2" format="float">
                            <StandardVariable name="sea_water_salnity"/>
                        </RecordVariable>
                        <RecordVariable name="Depth" longName="Depth" units="meters" columnIndex="3"
                            format="float">
                            <StandardVariable name="Depth"/>
                        </RecordVariable>
                        <RecordVariable name="CurrentDirection" longName="Current Direction"
                            units="degrees magnetic" columnIndex="4" format="float">
                            <StandardVariable name="direction_of_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="VerticalCurrentVelocity"
                            longName="Upward Sea Water Velocity" units="m/s" columnIndex="5"
                            format="float">
                            <StandardVariable name="upward_sea_water_velocity"/>
                        </RecordVariable>
                        <RecordVariable name="HorizontalCurrentSpeed" longName="Sea Water Speed"
                            units="m/s" columnIndex="6" format="float">
                            <StandardVariable name="sea_water_speed"/>
                        </RecordVariable>
                    </RecordDescription>
                </DataStream>
            </output>
        </Deployment>
    </Deployment>
</Metadata>
{code}
# It's recommended that the final XML is to be checked into the puckxml module in MBARI's CVS on moonjelly.
# Submit the Metadata to SSDS using the SSDSLoads application (available at [http://new-ssds.mbari.org/ssds-docs/client/]. The \-h option provides a usage note):
{code}
java -jar ssdsLoads-new-ssds.jar -d 1696.xml -x      # Use '-x' to test and then '-s' to submit
{code}
## If a mistake is made in the metadata (e.g. forgetting the platform Deployment) it may be easier to undo the submission and start over - do a deep delete on the parent deployment if this is the case.
## Minor attribute fixes may be done by editing the database once the deployments have been loaded
# Check that the metadata has been successfully loaded using the Explorer application.

h2. Establish data publishing application

# This step assumes that there will be some application reading data from the deployed instrument. Perhaps it is a legacy application which reads the data to load into a custom data storage or visualization system. For this application to publish data to SSDS it must have visibility of each record the instrument produces as that record needs to be "packaged" into a SensorDataPacket and "published" to SSDS.
# An example Java application that will package and publish a record is below:
{code}
import java.io.IOException;
import moos.ssds.jms.PublisherComponent;
import moos.ssds.transmogrify.SSDSDevicePacket;

/**
 * <p>
 * Publish instrument data records to the SSDS database. The client must provide
 * SSDS device ID, timeStamp, sequence number, and payload.
 * </p>
 * <hr>
 *
 * @author : $Author: mccann $
 * @version : $Revision: 1.17.2.7 $
 *          <hr>
 *          <p>
 *          <font size="-1" color="#336699"><a href="http://www.mbari.org"> The
 *          Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 *          documentation and code &quot;as is&quot;, with no warranty, express
 *          or implied, of its quality or consistency. It is provided without
 *          support and without obligation on the part of MBARI to assist in its
 *          use, correction, modification, or enhancement. This information
 *          should not be published or distributed to third parties without
 *          specific written permission from MBARI.</font>
 *          </p>
 *          <br>
 *          <font size="-1" color="#336699">Copyright 2008 MBARI.<br>
 *          MBARI Proprietary Information. All rights reserved.</font><br>
 *          <hr>
 *          <br>
 */

/**
 * @author mccann
 *
 */
public class SsdsPublisher {

	/**
	 * Publish data record from an instrument to SSDS
	 *
	 * @param deviceID
	 * 			is the SSDS Device ID for the instrument that produces the data in payload
	 * @param epochMilliseconds
	 * 			time of payload sample in milliseconds since 1/1/1970 0000 GMT
	 * @param sequenceNumber
	 * 			an incrementing number for each packet
	 * @param payload
	 * 			data from instrument
	 */
	public static void publish(long deviceID, long epochMilliseconds, long sequenceNumber,
			String payload) {

		// Create a publisher component
		PublisherComponent pc = new PublisherComponent();

		// Create a new SensorDataPacket
		SSDSDevicePacket packetToSend = new SSDSDevicePacket(deviceID, payload
				.getBytes().length);

		// Set the packet type to data (0 = Metadata, 1 = Data, 2 = Message)
		packetToSend.setPacketType(1);

		// Assign the time
		packetToSend.setSystemTime(epochMilliseconds);

		// Set the parentID to 0 for a parentless deployment
		packetToSend.setPlatformID(0);

		// Set the metadataref number to 0, if the data format changes and we can
		// refer to a different metadata packet then this number will change.
		packetToSend.setMetadataRef(0);

		// Set the sequence number
		packetToSend.setSequenceNo(sequenceNumber);

		// Set the payload
		packetToSend.setDataBuffer(payload.getBytes());

		// Set the record type to 1 as this is the most common situation
		packetToSend.setRecordType(1);

		try {
			pc.publishBytes(SSDSDevicePacket
					.convertToPublishableByteArray(packetToSend));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Test of SsdsPublisher.publish()
	 *
	 * @param args
	 *            No arguments are taken.  Test values hard coded.
	 */
	public static void main(String[] args) {

		/*
		 * Example packet for EITS instrument
		 */
		long eitsDeviceID = 1696; // 1696 is actual SSDS deviceID for EITS
		long sampleTime = 1228431283209L; // Sample time: 2008-12-04 22:54:43
		long sampleSequenceNumber = 1; // May set it to ID from DB insert

		// Payload values must match the RecordVariables in SSDS
		String samplePayload = "12.2, 4.3, 768.2, 2.3, 1.2, 0.2"; // Temp, Cond, Pres, U, V, W

		SsdsPublisher.publish(eitsDeviceID, sampleTime, sampleSequenceNumber, samplePayload);
	}

}
{code}
# An example of a shell script (the getM1 OASIS download) calling a perl script [^ssdsSubmit.pl] to publish download statistics records to SSDS:
&nbsp;
{code}
# Record start of download
set starttime_es = `perl -e 'print time, "\n"'`

# Download the data and record error status
$DOWNLOAD $DOWNLOAD_OPTS  >& $DATAFILE
set rtnsts = $status

# Record the end of download
set endtime_es = `perl -e 'print time, "\n"'`

# Get the raw data filesize
set filesize = `ls -l $DATAFILE | sed -f $BIN/fs.sed`

# Log download statistics and submit to SSDS - IDs are unique for mooring deployment
set deviceId = 1698
set parentId = 1306
/oasis/bin/ssdsSubmit.pl $deviceId $parentId "$starttime_es,$endtime_es,$filesize,$rtnsts"
{code}
# If using Java incorporate the above class into a Java application that reads the data from the instrument and calls a method like the main() example for each record
# Set up the application to execute the loads for the duration of the deployment
# Configure DStoNetCDF.pl cron job execution as is done for the OASIS data processing within the ssdsadmin account on elvis. (For MARS deployments this is done for the DataProducerGroup MARS2008; see the processCurrentMooringDataStreams.sh script in /u/ssdsadmin/dev/DPforSSDS/cimt/).
\\]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356361</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10389065</id>
<property name="body"><![CDATA[This page describes how you might configure a web application to consume the graphs that are generated by the SSDS.  The way this example is done is by using the Eclipse Java EE Edition to create a web application that allows the user to author pages and deploy them to an application server like Tomcat.

h3. Install Servlet Container
The first thing to do is install a servlet container where your web application will be deployed.  This is most often Tomcat, but can also be something that utilizes Tomcat internally (like JBoss).  For this example, we will download and use JBoss 4.2.2GA.

# Download JBoss from here [http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.2.GA/]
# Unpack the download to where you want to install it, open a command window, and change to the directory where you unpacked the download (where you installed it).
# Start the JBoss server by running run(.sh for Unix and .bat for Windows). Assuming now errors fly by and you get the 'server started in ...' message at the end, Jboss installed successfully.  You can use Cntl-C to stop the server.
# Now download Eclipse JEE 3.5 from here [http://eclipse.org/downloads/] and install it.
# Startup Eclipse after you install it.
# Go to the Workbench view so we can configure a server which will connect to your JBoss installation.
# Click on 'File->New->Other...' and then select 'Server->Server'. Then 'Next>'
# Then select 'JBoss->JBoss v4.2'.  The default server host of 'localhost' and server name of 'JBoss v4.2 on localhost' is fine. Click on 'Next>'.
# You can use the Default JRE and for the 'Application Server Directory' browse to the location where you unpacked JBoss.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10356352</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830013</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | metadataRef, metadataSequenceNumber, dataDescriptionID |
| parentId | direct copy to both parentID and platformID | parentId, platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| | If MetadataPacket, packetType = 0, if SensorDataPacket, packetType = 1, if DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797269</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830012</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | metadataRef, metadataSequenceNumber, dataDescriptionID |
| parentId | direct copy to both parentID and platformID | parentId, platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| | | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797268</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830017</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: # metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy to both parentID and platformID | # parentId
# platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| | If MetadataPacket, packetType = 0, if SensorDataPacket, packetType = 1, if DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797273</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830015</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | metadataRef, metadataSequenceNumber, dataDescriptionID |
| parentId | direct copy to both parentID and platformID | # parentId
# platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| | If MetadataPacket, packetType = 0, if SensorDataPacket, packetType = 1, if DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797271</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830005</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
## sourceID = sourceID

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797261</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830006</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | * metadataRef
* metadataSequenceNumber
* dataDescriptionID |
| parentId | direct copy to both parentID and platformID | * parentId
* platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797262</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830010</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | metadataRef, metadataSequenceNumber, dataDescriptionID |
| parentId | direct copy to both parentID and platformID | parentId, platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797266</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830008</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
# DevicePacket to SSDSDevicePacket
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy to metadataRef, metadataSequenceNumber, and dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy to both parentID and platformID | * parentId
* platformID |
| recordType | If DevicePacket is MetadataPacket, set recordType to 0, otherwise, set to recordtype of DevicePacket | recordType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet. If MetadataPacket, copy "bytes" buffer, if SensorDataPacket, copy "dataBuffer", if DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797264</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830002</id>
<property name="body"><![CDATA[{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}
This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of the translations and the rules between those translations

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797258</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11830000</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of the translations and the rules between those translations

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797256</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829999</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797255</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15664050</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15631300</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829903</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
#* For SummaryPackets, the packetType is 0.
#* For MeasurementPackets, the packetType is 4 (they are a sub class of DeviceMessagePacket).
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797155</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829905</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
#* For SummaryPackets, the packetType is 0 (they are considered data and they are differentiated by their recordType).
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797157</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829899</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797151</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829901</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797153</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">11829897</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">11797149</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15664052</id>
<property name="body"><![CDATA[{center}h3. Abstracts and Proposals{center}
# MOOS Project
## [2001 MOOS Project Proposal|SSDS Project Documentation^900027_MOOS_Program_2001.pdf]
## [2002 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2002.pdf] ([Phase 2 Feedback|SSDS Project Documentation^600125_MOOS_Ph_2.pdf])
## [2003 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_Program_2003.pdf]
## [2004 MOOS Project Proposal|SSDS Project Documentation^600125_MOOS_abstract_2004.pdf]
## [2006 MOOS Project Proposal|https://mww.mbari.org/resources/2006_Proposal_Process/Phase_1_pdfs/600125_MOOS_Proposal_2006.pdf]
## [2007 MOOS Science Experiment Proposal|https://mww.mbari.org/resources/2007_Proposal_Process/phase_I_pdfs/600027_MOOS_Science_Experiment_rev2.pdf]
## [2008 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2008_Proposal_Process/phase_I_pdfs/900820_MOOS_upper_Canyon.pdf]
## [2009 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2009_Proposal_Process/phase_I_pdfs/900820_2009UpperCanyon.pdf]
## [2010 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2010_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyon.pdf]
## [2011 MOOS Upper Canyon Experiment|https://mww.mbari.org/resources/2011_Proposal_Process/phase_I_pdfs/900820_MOOSUpperCanyonExperiment.pdf]
# SSDS Specific
## [2000 MOOS Data Management Proposal|SSDS Project Documentation^MOOS_Data_Management_Proposal_2000.pdf]
## 2008 SSDS Hardening Project
### [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
### [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
### [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
### [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
### [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
### [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
### [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]
## 2011 Data Security And Policy Project
### [2011 Abstract (Word)|SSDS Project Documentation^Data_Security_for_SSDS.doc]
### 2011 Proposal ([Notes|2011 Proposal Notes])

----

{center}h3. Notes and memos{center}
# [2002-03-14 SSDS ISI Interface Meeting Notes|SSDS Project Documentation^2002-03-14_SSDS_ISI_Interface Meeting Notes.pdf]
# [Weekly Notes from January 5, 2006]
# [Weekly Notes from January 12, 2006]
# [Weekly Notes from January 26, 2006]
# [Weekly Notes from February 2, 2006]
# [Weekly Notes from February 16, 2006]
# [Weekly Notes from March 2, 2006]
# [Weekly Notes from March 9, 2006]
# No meeting on March 16, 2006
# [Weekly Notes from March 23, 2006]
# [Weekly Notes from March 30, 2006]
# [Weekly Notes from April 6, 2006]
# [Weekly Notes from April 13, 2006]
# [Weekly Notes from April 21, 2006]
# [Weekly Notes from April 27, 2006]
# No Meeting on May 4, 2006
# No Meeting on May 11, 2006
# [Weekly Notes from May 18, 2006]
# [Weekly Notes from May 25, 2006]
# [Weekly Notes from June 1, 2006]
# [Weekly Notes from June 8, 2006]

h5. Other Meetings

# [OSG Meeting Notes from January 12, 2006]
# [Mooring Meeting Notes from January 24, 2006]
# [Mooring Meeting Notes from January 31, 2006]
# [Mooring Meeting Notes from February 14, 2006]
# [Mooring Meeting Notes from February 27, 2006]
# [Mooring Meeting Notes from April 05, 2006]
# [MOOS Test Mooring Meeting (January 17, 2007)|MTM_2007_01_17]
# [SSDS Strategy Meeting on January 22, 2007]

----

{center}h3. Papers and Presentations{center}

# [2001 Standard Metadata and Data Formats|SSDS Project Documentation^MetadataISIApr2001.ppt] which was presented to the ISI group to frame the discussion of what type of metadata we would use in the ISI system which would then get into the SSDS System.
# [2006 Oceans Conference Paper|^PID286147.pdf]
# [2006 Oceans Conference Presentation|^SSDS_Oceans_2006.ppt]

----

{center}h3. Products{center}


h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [SPEPRJ:ssds-ingest.shore.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15631302</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">8945860</id>
<property name="body"><![CDATA[h3. Installation Instructions and Development Setup for the Shore Side Data System

Although these instructions may seem VERY long, they cover a lot of ground and with much detail.  The idea was to make this as detailed as possible to make it exceptionally clear every step of the way.  Some topics are somewhat lengthy to setup (like SSL), but are, in fact, very necessary for various reasons (security for the SSL case).  These instructions were performed on a Apple OS X installation, but should apply to most Unix variants including Linux and OS X.  We will try to get a Windows example up at some point in the future.

So, without further ado, let's get to it!
# Check out the SSDS code base from Google Code.
## You will have to have a Google account to check out the code
## This step will depend on the subversion client you use, but as an example, here is how you would do it with command line as a project member (can make changes)
{code}
svn checkout https://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system --username jdoe
{code}
A read-only checkout can happen anonymously like:
{code}
svn checkout http://shore-side-data-system.googlecode.com/svn/trunk/ shore-side-data-system-read-only
{code}
{note:title=Ignore directories}
If you are using a GUI client for subversion that can ignore directories, you will want to ignore the following directories (they won't appear until you run ant):
* build
* dist
* src/gen
{note}
# Install Java.  You need at least Java 5 (J2SE 1.5) and most likely you will get that from the [http://java.sun.com] website.  I recommend following the installation instructions from that web site as well.  Once the installation is complete, you should have the java commands available at the command/shell prompt (i.e. the Java bin commands are in your path)
# Install Ant
# Install Apache 2 Server
# Download and install a database of choice.  Well, sort of :).  We have only really tested SSDS with MySQL 5 and with MS SQL Server.  So, choose between those :).  We feel that MySQL is the most likely candidate, so these instructions use that as an example.  With MySQL, follow the instructions from MySQL and configure it so that it will start automatically on machine start-up.
# After installation of MySQL, you should have mysql commands available at the command/shell prompt.
# Download Jboss distribution
# Unzip to an installation location
# Copy custom.properties.template to custom.properties and edit
# Open command prompt, cd to directory where SSDS was checked out and type 
{noformat}ant -Dtarget=deploy{noformat}
# Using mySQL command utility, run the MySQL script to setup DB
# Start JBoss
# Configure mod_jk in Apache/JBoss
# Configure SSL for login.jsp page

Setup an Eclipse project:
# Source directories should be src/java and src/gen (created by ant during build)
# Add all jars in the lib directory
# Add src/resources/build/antlr/antlr-2.7.5.jar
# Add JBoss jars
## JBOSS_HOME/client/activation.jar
## JBOSS_HOME/client/servlet-api.jar
## JBOSS_HOME/client/jboss-j2ee.jar
## JBOSS_HOME/client/log4j.jar
## JBOSS_HOME/server/default/lib/commons-codec.jar
## JBOSS_HOME/server/default/lib/commons-collections.jar
## JBOSS_HOME/server/default/lib/commons-httpclient.jar
## JBOSS_HOME/server/default/lib/hibernate3.jar
## JBOSS_HOME/server/default/lib/mail.jar
# output set to build/classes (to align with ant's build files)

Create a FlexBuilder (plug-in) project:
# Start Eclipse with Flex-Builder plug-in installed
# File->New->Other..
# Select Flex Builder->Flex Project
# Type in 'ssds-flex' for name
# Uncheck 'Use default location'
# Browse to SSDS_HOME/src/web and select choose
# Select 'Web Application'
# Select 'J2EE' as Application Server Type
# Check Use remote object access service
# Click Next>
# Uncheck 'Use default location for Local LifeCycle Data Service server'
# Browse to SSDS_HOME/src/resources/flex and choose for the 'Root folder'
# Change 'Root URL' to the URL of the servlet context (for example, on localhost it would be 'http://localhost:8080/servlet/')
# Change the 'Context Root'to '/servlet/'
# Select 'Compile Application Locally in Flex Builder'
# For 'Output folder location' put your deployment directory for the web application (for example /Users/kgomes/Applications/jboss-4.2.2.GA/server/default/deploy/ssds.war)
# Click Validate Configuration (it will warn that the output folder is not a subfolder of the server root (that is OK).
{note:title=Will create a Main.mxml}
Note that the creation of the Flex Builder project will create a Main.mxml file.  To fix this, right click on explorer.mxml and choose 'Set As Default Application', then you can delete the Main.mxml file.
{note}

NOTE: To run the tests fully, you must have perl installed with the following module:
# Class-ObjectTemplate-0.7 (http://search.cpan.org/~jasons/Class-ObjectTemplate-0.7/)

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">8913100</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10945019</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket).  Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|?|
|DevicePacketVersion|java.lang.long|?|
|SourceID|java.lang.long|The ID of the device that the message was generated by|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short| |
|SecondPacketVersion|java.lang.long| |
|FirstBufferLength|java.lang.int| |
|FirstBuffer|java.lang.byte []| |
|SecondBufferLength|java.lang.int| |
|SecondBuffer|java.lang.byte []| |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType.
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0.
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  Once the write is complete, the byte array is then re-published to the next topic which is being consumed by another MDB named "SQLIngestMDB".
 
h5. SQLIngest Packet Structure

This MDB simply takes the byte array sent in and constructs a PacketSQLOutput based on deviceID only.  This corresponds to a table in the backing database.  The PacketSQLOutput then records the packet to a row in the database. The database table is named after the SSDS ID of the device and is created on the fly by the SSDS.  Here is the format of the relational database table:

|ssdsPacketVersion|parentID|packetType|packetSubType|dataDescriptionID|dataDescriptionVersion|timestampSeconds|timestampNanoseconds|sequenceNumber|bufferLen|bufferBytes|bufferTwoLen|bufferTwoBytes|

These all match the attributes from the previous section except for the ssdsPacketVersion.  This is used to allow for migration of the format of the packets.  If we add or remove fields, by changing this version number we can customize the PacketInput and PacketOutput classes to handle these various version correctly.

h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10912264</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15664154</id>
<property name="body"><![CDATA[This page documents the components that are known as "Transmogrify" (nod to Bill Watterson here) and "Ingest". These are the components that take in data and metadata streams and perform various tasks with them as they are brought into the SSDS. They are both implemented as Message Driven Beans (EJB) and are wired in series with Transmogrify feeding into Ingest. The original reason for having both was that Transmogrify was to handle data and metadata from the SIAM system that had some special characteristics and needed to be converted to the generic message format that the SSDS is expecting. If someone wanted to send the generic format, they could bypass the Transmogrify and send straight to Ingest. As with all things, patchwork becomes production and Transmogrify lives on to this day.

Here is a sequence diagram of the basic steps that occur when a packet is submitted via JMS to the SSDS.

!Transmogrify Steps.jpg!

h5. Transmogrify Packet Structure

Our initial and primary publisher of data for the SSDS was the SIAM infrastructure.  Initially they would publish serialized Java objects that were SIAM DevicePacket classes.  In the SSDS, we created SSDSDevicePacket sub classes to map the SIAM DevicePacket information to the SSDS world.  Here is a class diagram of the classes involved:
!Device Packets.jpg|align=centre!

Just as a note, the idea with the SSDSGeoLocatedDevicePacket was that if there was a way to link a particular device to another device that was providing geospatial data, you could correlate all the SSDSDevicePackets by time with that device and tag each individual packet with a geospatial reference.

When the Transmogrify component receives a SIAM DevicePacket, it converts it to a SSDSDevicePacket (using the constructor of the SSDSDevicePacket). Here are the various attributes on the classes and how they map to each other.

||DevicePacket||MetadataPacket||SensorDataPacket||DeviceMessagePacket||SensorStatusPacket||SSDSDevicePacket||SSDSGeoLocatedDevicePacket||Description||
|_sourceID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the ID of the device that generated the packet|
|_systemTime|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the timestamp (in epoch milliseconds) when the packet was created by the system.  This may or may not match instrument time if the clocks are not synchronized|
|_sequenceNo|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is a number that should indicate the order of generation of the packet from the device|
|_metadataRef|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the sequence number of the packet that contains the metadata that describes the contents of this packet.  If it is a MetadataPacket, this has no meaning.|
|_parentID|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|This is the SSDS ID of the device to which the generated device was connected when it generated this packet. Null means no parent.|
|_recordType|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_|_inherited_ but also equal the local recordType|This defines the "Type" of record that this packet contains.  Devices can send many forms of records, error messages, etc. and this help define what is actually in the payload for this message.  There are three main options here:
* -1 = This means the record type has not been defined
* 0 = Metadata packet which contains information about the instrument or other aspects of the observatory.  The SSDS definition of a metadata packet encompasses all the various metadata packets in SIAM.  So this means that MetadataPacket and DeviceMessagePacket from the SIAM world are both just tagged a record type 0.
* 1+ = Data packets and they can be of any kind.  The record type allows the device driver writer to group messages that are of the same format (usually).  Since the serialized class method is not used anymore, transmogrify ignores SensorStatusPackets which were developed later and use a different serialization method.|
|X|_bytes|X|X|X|dataBuffer|_inherited_|This is a payload that contains information like service properties, SSDS XML, etc.  In the SSDSDevicePacket constructor, the _bytes buffer is mapped into the dataBuffer|
|X|_cause|X|X|X|otherBuffer|_inherited_|Another set of bytes that was meant to hold information about why the metadata packet was generated.  In the SSDSDevicePacket constructor, it is mapped to the otherBuffer|
|X|X|_dataBuffer|X|X|dataBuffer|_inherited_|This is the sample from the device that is packaged in an array of bytes.  In the SSDSDevicePacket constructor, the _dataBuffer is mapped to the dataBuffer|
|X|X|X|_message|X|dataBuffer|_inherited_|This is the message contents that are packaged into an array of bytes.  In the SSDSDevicePacket constructor, the _message is mapped to the dataBuffer|
|X|X|X|X|_statusBytes|X|X|This is the message about the instrument status as an array of bytes.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|_cause|X|X|Some message, as an array of bytes, that describes why the status message was sent.  Since we broke from serialized objects before this class existed, SSDS ignores this type of object.|
|X|X|X|X|X|dataDescriptionVersion|_inherited_|This is used to indicate minor metadata changes that were not enough to create new SSDS "buckets" which were actual storage file before moving to a database.|
|X|X|X|X|X|packetType|_inherited_|This is an integer to define what type of packet this is:
* 0 = MetadataPacket
* 1 = SensorDataPacket
* 2 = DeviceMessagePacket|
|X|X|X|X|X|X|longitude|Longitude where the packet was generated|
|X|X|X|X|X|X|latitude|Latitude where the packet was generated|
|X|X|X|X|X|X|depth|Depth (m) where the packet was generated|

We quickly ran into versioning and deserialization issues, so instead, SIAM began publishing their packets as javax.jms.BytesMessages that had a structured payload that was the result of the writeExternal method of the Externalizable interface.  So, what comes across in a BytesMessage is a payload that looks like the following:
{gliffy:name=SIAM Externalizable Structure|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}

where:

||Name||Type||Description||
|StreamID|java.lang.short|This basically states that the bytes are coming from a SIAM ExportablePacket class. SIAM uses constants defined in the org.mbari.siam.distributed.Exportable.java class to enumerate things like this and the short value for this is always 0x0100. SSDS Doesn't really care so we essentially ignore it.|
|DevicePacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array.  SSDS Does not really care and as of this writing, it is always 0.|
|SourceID|java.lang.long|The ID of the device that the message was generated by.|
|Timestamp|java.lang.long|Epoch milliseconds (number of elapsed milliseconds since 1/1/1970 00:00:00) that the packet was generated by the device|
|SequenceNumber|java.lang.long|A number that is supposed to show the order of generation of packets from the device|
|MetadataRef|java.lang.long|This is the sequence number of the packet that contains the metadata that describes the information in this packet|
|ParentID|java.lang.long|The ID of the device that the generated device was attached to when it generated the packet|
|RecordType|java.lang.long|The type of record that this packet contains:
* 0 = MetadataPacket
* 1 = Non-MetadataPacket (Data and other)|
|SecondStreamID|java.lang.short|This defines the type of DevicePacket that was used to construct the byte array.  The values are as follows:
# MetadataPacket = 0x101
# SensorDataPacket = 0x102
# DeviceMessagePacket = 0x103
# SummaryPacket = 0x102 (same as SensorDataPacket)|
|SecondPacketVersion|java.lang.long|This is the "serialVersionUID" on the class that was used to export the bytes.  It is the version of SIAM class that generated the byte array. As of this writing, it is the same as the DevicePacketVersion.  Since currently it is always 0, SSDS ignores it.|
|FirstBufferLength|java.lang.int| This is the length of the array that holds the bytes of the first buffer |
|FirstBuffer|java.lang.byte []| This is the bytes array that represents the first buffer |
|SecondBufferLength|java.lang.int| This is the length of the array that holds the bytes of the second buffer. |
|SecondBuffer|java.lang.byte []| This is the array that holds the bytes of the second buffer. |

Now, in order to handle both types of inputs in Transmogrify (DevicePackets and BytesMessage structure), Transmogrify would take both and convert to a common format that would contain the information to cover both types of messages.  Since the BytesMessage structure encompasses all the information in the DevicePacket, we simply used that byte structure and in Transmogrify, a DevicePacket is converted to a SSDSDevicePacket which is then converted to the same BytesMessage structure using the SSDSDevicePacket.convertToPublishableByteArray method.  So at the end of the Transmogrify process, we have on byte array that is in the form of the diagram above that will then be used to publish a message to the next component which is Ingest.  Transmogrify takes the SIAM byte array structure and converts it to the SSDS native byte array structure:
{gliffy:name=SSDSByteArrayFormat|space=SSDS|page=Ingest Architecture|pageid=8355863|align=left|size=L}
Notes on the conversion:
# The DevicePacketVersion, SecondStreamID, and SecondPacketVersion are used to determine the correct packetType (although, right now, DevicePacketVersion and SecondPacketVersion are ignored).
#* For MetadataPackets, the packetType is 1.
#* For SensorDataPackets, the packetType is 0 (SummaryPackets come across as SensorDataPacket and are differentiated by their recordType).
#* For DeviceMessagePackets, the packetType is 4.
# If the incoming packet is a MetadataPacket, the packetSubType is set to 0.  Otherwise, it is set to the RecordType field.
# The RecordType is set to zero if the packet is a MetadataPacket and set equal to the RecordType from SIAM if not a MetadataPacket.
# The MetadataSequenceNumber is calculated depending on the device, it's parent, and the XML that is in it's payload.  There is a component called the SIAMMetadataTracker that keeps track of this information and looks for real XML changes which is what should fire a change in metadata.
# The buffers are swapped if it is a MetadataPacket.  It always seemed to logical to do it that way.
# This timestamp (epoch milliseconds) is split into seconds and nanoseconds.

{warning:title=Message Size Limitation!}
Please note that because byte arrays are limited to 32 bit sizes, the largest payload of a message that can be converted by SSDS is 2GB.  While this does not seem like a major restriction, it can be hit if somebody is using straight JMS messaging (or other) and makes a payload bigger than 2GB.  SSDS will just ignore such a message.
{warning}
h5. Ingest Packet Structure

So now we have all messages coming into Ingest in a format that SSDS is expecting (i.e. that matches the SSDS view of the world). For the diagram in the previous section, the attributes in the SSDS Bytes Array are:

||Attribute||Type||Description||
|sourceID|java.lang.long|This is what is known as the SSDS ID for the device (i.e. DeviceID) that actually generated the packet of information.|
|parentID|java.lang.long|This is the SSDS ID for the parent that the device was connected to when it sent the packet. If the ID is zero (0), then the generating device was not connected to a parent.|
|packetType|java.lang.int|This is the "Type" of packet that is being sent. It is basically an enumerated list the with following context:
0 = Data Packet
1 = Metadata Packet
2 = 
3 = 
4 = Device Message Packet|
|packetSubType|java.lang.long|This is the equivalent of the "recordType" listed in the Transmogrify component. It is used to provide the hook to tell the client applications what type of record this is that was sent. It really only has meaning in the context of data packets as a device can often send data packets of different formats. This basically tells the application which record form is being sent in this packet.|
|metadataSequenceNumber|java.lang.long|Also referred to as dataDescriptionID|
|dataDescriptionVersion|java.lang.long| |
|timestampSeconds|java.lang.long)| |
|timestampNanoseconds|java.lang.long| |
|sequenceNumber|java.lang.long)| |
|bufferLen|java.lang.int| |
|bufferBytes|java.lang.byte\[bufferLen\]| |
|bufferTwoLen|java.lang.int| |
|bufferTwoBytes|java.lang.byte\[bufferTwoLen\]| |

The Ingest Message Driven Bean (MDB) then takes that byte array and using a PacketOutput class that corresponds to the correct source ID, metadataSequenceNumber, packetSubType, and parentID, it writes the packet to disk.  It then uses a PacketSQLOutput to write that same packet to a table in the database.
 
h5. Packet Translations

So, through all this, there are basically four representations of data packets in the SSDS ecosystem:

# SIAM Device Packet (and its sub classes MetadataPacket, SensorDataPacket, DeviceMessagePacket)
# SSDSDevicePacket (and its sub class SSDSGeoLocatedDevicePacket)
# SIAM Byte array (from Exportable class)
# SSDS Byte array

Here is a diagram of these various forms of data
{gliffy:name=Packet Translations|space=SSDS|page=Ingest Architecture|pageid=8355863|align=center|size=L}

And the translation rules (some of these may seem very strange for legacy reasons).
h6. DevicePacket to SSDSDevicePacket
*This translation is done in the constructor of SSDSDevicePacket which takes in a DevicePacket*
|| DevicePacket || Translation Rule || SSDSDevicePacket ||
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy: 
# metadataRef->metadataRef
# metadataRef->metadataSequenceNumber
# metadataRef->dataDescriptionID | # metadataRef
# metadataSequenceNumber
# dataDescriptionID |
| parentId | direct copy:
# parentId->parentId
# parentId->platformID | # parentId
# platformID |
| recordType | # MetadataPacket: recordType to 0
# Other: direct copy | recordType |
| | # If MetadataPacket, packetType = 0
# If SensorDataPacket, packetType = 1
# If DeviceMessagePacket, packetType = 2 | packetType |
| firstBufferLength | ignored | |
| firstBuffer | First buffer depends on which type of packet
# If MetadataPacket, copy "bytes" buffer
# If SensorDataPacket, copy "dataBuffer"
# If DeviceMessagePacket, copy "message" | firstBuffer |
| secondBufferLength | ignored | |
| secondBuffer | Only exists if MetadataPacket and will copy over "cause" buffer | secondBuffer |

h6. DevicePacket to SIAM Byte Array
This is done by the SIAM Exportable Packet class
|| DevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataRef | direct copy | metadataRef |
| parentId | direct copy | parentId |
| recordType | direct copy | recordType |
| | This is set based on what type of packet:
# If MetadataPacket, set to 0x0101
# If SensorDataPacket, set to 0x0102
# If DeviceMessagePacket, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| firstBufferLength | direct copy (see note for first buffer) | firstBufferLength |
| firstBuffer | This depends on the type of packet:
# If MetadataPacket, "cause" bytes are copied over
# If SensorDataPacket, "dataMessage" bytes are copied over
# If DeviceMessagePacket, "message" bytes are copied over | firstBuffer |
| secondBufferLength | only valid with MetadataPacket, but is copied directly over | secondBufferLength |
| secondBuffer | only valid with MetadataPacket, and the "buffer" bytes are copied over | secondBuffer |

h6. SSDSDevicePacket to SIAM Byte Array
*Originally done in TransmogrifyMDB by calling SSDSDevicePacket.convertToPublishableVersion3ByteArray before passing byte array to method to translate to SSDS format and then send to ingest*
|| SSDSDevicePacket || Translation Rule || SIAM Byte Array ||
| | This is a static value that is set to indicate the byte array is a DevicePacket and is set to 0x0100 | EX_DEVICEPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| sourceID | direct copy | sourceID |
| systemTime | direct copy | systemTime |
| sequenceNo | direct copy | sequenceNo |
| metadataSequenceNumber | direct copy | metadataRef |
| parentID | direct copy | parentID |
| recordType | # If packetType = 0, set recordType = 0
# If packetType = 1, set recordType = recordType
# If packetType = 2, set recordType = recordType | recordType |
| | This is set based on what type of packet:
# If packetType = 0, set to 0x0101
# If packetType = 1, set to 0x0102
# If packetType = 2, set to 0x0103 | EX_XXXXXXPACKET |
| | This is just the serial version UID of the class which is always 0 | serialVersionUID |
| | This depends on the type of packet:
# If packetType = 0, set to length of "otherBuffer" 
# If packetType = 1, set to length of "dataBuffer"
# If packetType = 2, set to length of "dataBuffer" | firstBufferLength |
| other/dataBuffer | This depends on the type of packet:
# If packetType = 0, set to bytes from "otherBuffer" 
# If packetType = 1, set to bytes from "dataBuffer"
# If packetType = 2, set to bytes from "dataBuffer" | firstBuffer |
| | This only exists if it is packetType = 0 then it is set to the length of the "dataBuffer" | secondBufferLength |
| dataBuffer | This only exists if it is packetType = 0 then it is set to the byte from  the "dataBuffer" | secondBuffer |

h5. SSDSDevicePacket to SSDS Byte Array
*Originally done in SSDSDevicePacket.convertToVersion3ByteArray*
|| SSDSDevicePacket || Translation Rule || SSDS Byte Array ||
| sourceID | direct copy | sourceID |
| systemTime | ignored during the translation directly, but used through getter methods for seconds and nanoseconds | |
| timestampSeconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampSeconds |
| timestampNanoseconds | direct copy (note that this is _sort of_ a direct copy, there are getter methods on SSDSDevicePacket that convert the systemTime to seconds and nanoseconds when called). | timestampNanoseconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | ignored | | 
| parentID | ignored | |
| recordType | If packetType = 0, set packetSubType to 0, otherwise set to recordType | packetSubType | 
| packetType | Depends on packetType:
# If packetType = 0, set to 1
# If packetType = 1, set to 0
# If packetType = 2, set to 4 | packetType |
| metadataSequenceNumber | direct copy | metadataSequenceNumber |
| dataDescriptionVersion | direct copy | dataDescriptionVersion |
| platformID | direct copy | parentID |
| | copy length of dataBuffer | firstBufferLength | 
| dataBuffer | direct copy | firstBuffer |
| | copy length of otherBuffer | secondBufferLength |
| otherBuffer | direct copy | secondBuffer |

h6. SIAM Byte Array to SSDS Byte Array
*Originally done in TransmogrifyMDB in checkAndPublishBytes method*
|| SIAM Byte Array || Translation Rules || SSDS Byte Array ||
| EX_DEVICEPACKET | ignored | |
| serialVersionUID | ignored | |
| sourceID | direct copy | sourceID |
| | Depending on EX_XXXXXXXPACKET:
# If MetadataPacket, set packetType to 1
# If SensorDataPacket, set packetType to 0
# If DeviceMessagePacket, set packetType to 4 | packetType |
| | This was set using the SIAMMetadataTracker that tried to keep track of real version numbers based on XML in payload | metadataSequencNumber |
| systemTime | Split into timestampSeconds and timestampNanoseconds | # timestampSeconds
# timestampNanoSeconds |
| sequenceNo | direct copy | sequenceNumber |
| metadataRef | direct copy | dataDescriptionVersion |
| parentId | direct copy | parentID |
| recordType | If MetadataPacket (determined from EX_XXXXXXXPACKET), recordType set to 0, otherwise set to recordType | packetSubType |
| EX_XXXXXXXPACKET | ignored in storage, but used in logic | |
| serialVersionUID | ignored | |
| first/secondBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBufferLength is set to secondBufferLength so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBufferLength | firstBufferLength |
| first/secondBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), firstBuffer is set to secondBuffer so we can flip the "cause" and "buffer" bytes because it just made more sense since the cause was rarely populated. Otherwise set to firstBuffer | firstBuffer |
| firstBufferLength | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBufferLength is set to firstBufferLength to flip "cause" and "buffer" bytes | secondBufferLength |
| firstBuffer | If MetadataPacket (determined from EX_XXXXXXXPACKET), secondBuffer is set to firstBuffer to flip "cause" and "buffer" bytes | secondBuffer |


h5. Exploration of Upgrade of Ingest/Transmogrify to AMQP

In an effort to allow non-Java clients to send data to SSDS in the form of messages and to upgrade the messaging system to a technology that is more scalable and higher performance, an investigation of AMQP implementations was done.

# [Qpid Exploration]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15631403</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">1047</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Drawings|ProjectDrawings]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|ProjectPresentations]
# [Purchase Orders|PurchaseOrders]

Related Project Sites:
# [CIMT Web App|http://ssdspub.mbari.org:8080/cimt]
# [MTM-3 Web App|http://ssdspub.mbari.org:8080/mtm3]
# [MSE Web App|http://ssdspub.mbari.org:8080/mse]

Related Links:
# [Alfresco Content|http://oceana:8080/alfresco/navigate/browse/workspace/SpacesStore/01210ac5-5e62-11db-a210-d930edf2728c]
# [JIRA Bug Tracking|http://oceana:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">1050</id>
</property>
</object>
<object class="ReferralLink" package="com.atlassian.confluence.links">
<id name="id">10322085</id>
<property name="viewCount">1</property>
<property name="url"><![CDATA[http://www.google.com.au/search?hl=en&tbs=qdr%3Aw&q=mars+node&meta=]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">10355672</id>
</property>
<property name="creatorName"/><property name="creationDate">2009-08-07 07:06:15.083</property>
<property name="lastModifierName"/><property name="lastModificationDate">2009-08-07 07:06:15.083</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">15237240</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation


h5. Abstracts and Proposals

# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]
# [2011 Abstract (Word)|^Data_Security_for_SSDS.doc]
# 2011 Proposal ([Notes|2011 Proposal Notes])

h5. Project Schedule

# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Design

# [Requirements|ProjectRequirements]
# Transmogrify and Ingest
** [Architecture|Ingest Architecture]
** [Deployment|Transmogrify and Ingest Deployment]
** [Testing|Testing TransmogrifyMDB and Ingest]
# [Services]
# Client
** [Data Simulator]
# [User Interfaces|UserInterfaces]

h5. Developer

# [Installation and Development]
# [Migration to Google Code Base]

h5. Operational

# [new-ssds.mbari.org Setup]
# [OASIS Mooring Data Processing Overview]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
# [Republishing Data From SIAM Node]
# [Publishing other non-SIAM data to SSDS|SSDS:Publishing other non-SIAM data to SSDS]
# [Analyzing signals from MARS using SSDS and Matlab|OneStopShopping:Analyzing signals from MARS using SSDS and Matlab]
# [How to Configure Graphs]
# [An example use of Graphs - FOCE]

h5. Other installations

# [USC]
# [ALOHA]
# [NREL]
# [SRVI]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">15204476</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4948030</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

And then a diagram of how they will look after the cleanup:

!After Cleanup Deployment.jpg|thumbnail!

And then the steps on how to make that transition:

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}
# OK, now with that all cleaned up, I needed to move the existing updatebot, graphing and data checking perl script to the machine
{noformat}
pismo.shore.mbari.org
{noformat}
## Pat was able to construct the same directory structures and permissions on pismo as on predator, so I just copied the files over to /opt/ssds and changed the scripts to point to the correct java locations.
## With the data checking perl script, I changed it to point to the new-ssds GetOriginalDataServlet so that it would be reading the packets from the database and is a much better test as we can see the packets at the database and not just the file system.

h3. new-ssds.mbari.org

# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915267</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4948020</id>
<property name="body"><![CDATA[This is the project page for the Shore Side Data System Project.

SSDS Products:

# [Production Web App|http://new-ssds.mbari.org]

Project Documentation:
# [Documents|ProjectDocuments]
# [Memos and Minutes|Project Memos Minutes]
# [Presentations|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Presentation]
# [Purchase Orders|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Accounting]

Related Project Sites:
# [CIMT Web App|http://new-ssds.mbari.org:8080/cimt/cimt.jsp]

Related Links:
# [Alfresco Content|https://alfresco.mbari.org/alfresco/n/browse/workspace/SpacesStore/10975f35-b7ed-11dc-bd45-23e9cb9ede54]
# [JIRA Bug Tracking|http://oceana.shore.mbari.org:8082/browse/SSDS]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915257</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4948022</id>
<property name="body"><![CDATA[In order to get our local (MBARI) installation of SSDS in a manageable state, I went through an application consolidation phase to try and clean up a bunch of stuff.  The first thing to do was to create a layout of how things are now.

!Before Cleanup Deployment.jpg|thumbnail!

And then a diagram of how they will look after the cleanup:

!After Cleanup Deployment.jpg|thumbnail!

And then the steps on how to make that transition:

h3. ssdspub.mbari.org

The easiest place to clean first, was the machine ssdspub.mbari.org.  Currently it is basically just serving the purpose of a tomcat container.  There are still services out there, but they are not really serving any purpose since they are pointed to a database that is defunct.  To clean up, I did the following:

# I first removed the axis.war file from the deploy directory.
# I then removed the omse.war and the mse.war web applications.
{note:title=Move MSE to the inside?}
I am wondering if I shouldn't move the mse.war pages to the new-ssds.mbari.org server so they are at least available.
{note}
# I then shutdown Jboss, removed access.war, ssds-data-mssql-ds.xml, ssds-mssql-ds.xml and ssds-services-ssdspub.jar
{note:title=access.war wasn't so simple}
When I removed access.war, it messed up some people who were using the old GetOriginalDataServlet and the forwards from the old /access/*.jsp's were broken.  I put an access.war back out there, but removed the servlets and put notes on the other pages that said either the pages were no longer available or where they could go to get to them.
{note}
# I then deployed access.war and cimt.war on to new-ssds.mbari.org (to prepare for the CNAME change)
# I then restarted JBoss
# I also updated the index.html page in the apache installation to point to the cimt web application so that if people go to ssdspub.mbari.org they will see something.
# I had Neil shut off the replication jobs that were rebuild the SSDS database on ssdspub each day.
# I also had Todd and Neil shut off the replication jobs that were copying the raw data files from bob.shore.mbari.org, iagdata share on tornado, and the ssdsdata share on tornado out to SSDSPub as they are no longer needed.
# I then set the MSSQLServer and SQLServerAgent service to 'Manual' and shut them off.
{note:title=Get rid of SSDSPUB?}
In theory, I should now be able to remove ssdspub.mbari.org if I CNAME it to new-ssds.mbari.org
{note}

h3. predator.shore.mbari.org
# Next, I could do a similar cleanup of predator. 
# First, I removed axis.war
# Then I removed mtm3.war
# Now, my current thinking is that instead of going through the database and changing everything under the sun, can I just change the CNAME of ssds.shore.mbari.org to point to new-ssds.mbari.org.  In order to do that, I need to:
## Change all references from predator.shore.mbari.org to ssds.shore.mbari.org in DataContainer.uriString, Resource.uriString and Software.uriString and make sure those entities exist.
### First I queried to find all the DataContainers with predator in their URIString. I got back 23 rows of DataContainers whose uriStrings are no longer valid.  Since this is the case, there will be no harm in just changing them with the following SQL:
{noformat}
UPDATE ssdsdba.DataContainer SET uriString = REPLACE(uriString, 'predator.shore', 'ssds.shore') WHERE uriString like '%predator.shore%'
{noformat}
### Next thing was to do it for the Resources.  Now, here there was a small snag.  Some of the old NetCDF logs have an analogous entry for ssds.shore already so when the update was tried, I got duplicate unique key constraint violations.  So, first I just searched for entries that pointed to the ssds/xml directory.
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
This returned 47 rows and they seemed to be valid uriStrings even though they were from really old stuff.  So, I simply changed the uriString to point to ssds.shore instead of predator with the following:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'predator.shore','ssds.shore') where uriString like '%predator.shore.mbari.org/ssds/xml%'
{noformat}
### After that, I queried for the other resources with predator in the name using:
{noformat}
SELECT * from ssdsdba.Resource where uriString like '%predator.shore%'
{noformat}
and it returned 24 rows of things that do not exist.  Since they don't exist at the uri's and renamed hit unique key constraints, I just decided to remove them by first removing references to them in the assocResource tables.
{noformat}
select * from ssdsdba.DataContainerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DataProducerAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.DeviceAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
select * from ssdsdba.SoftwareAssocResource where ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
The only one that found anything was for DataProducers (48 rows), so I removed all assoc records using:
{noformat}
delete from ssdsdba.DataProducerAssocResource WHERE ResourceID_FK in (select id from ssdsdba.Resource where uriString like '%predator.shore%')
{noformat}
Now that all the links to the resources with uriStrings with predator are removed, remove the resources themselves with:
{noformat}
delete from ssdsdba.Resource WHERE uriString like '%predator.shore%'
{noformat}
That removed 24 rows
### There were no uriStrings in the Software table that have references to predator.shore, so I did not do anything
## Now that the predator name has been removed from the uriStrings, let's make sure there are no dods references in the uriStrings.  I can search for those using:
{noformat}
SELECT * from ssdsdba.DataContainer where uriString like '%nph-dods%'
{noformat}
That returned a whopping 1590 records, but there are basically two roots of the URLs that are of importance, they are:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/
{noformat}
and
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
Since the auvctd ones are mapped through to the auvctd share on Tornado and the dods.mbari.org auvctd is the same, we can simply map the ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd to the dods.mbari.org machine using
{noformat}
UPDATE ssdsdba.DataContainer set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd','http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd') where uriString like 'http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd%'
{noformat}
Since the rest of the DataContainers that have uriStrings with nph-dods in them are pointing to old data and I can't rename them (they would create duplicate uriStrings because we used to put parallel dods and http file uris in there), I am just going to let them be and have broken links (for now).  So there are 1255 records like that with broken links.
## Verify all DODS urls are accessible through dods.mbari.org
### Currently, here is the list of DODS URLs that are available through ssds.shore.mbari.org:
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/ (which is the mount of AUVCTD on Tornado)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/clients/ (which is a broken link)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/data/ (which is the mount to the data volume on bob.shore.mbari.org).
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
#### http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
### Let's look at these on a case-by-case basis
#### The AUVCTD mount on ssds.shore is the same as the one on dods.mbari.org.  So the following URLs should be equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/auvctd/
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/auvctd/
{noformat}
#### For the clients URL, since it is broken, there is no equivalent
#### For the /data which is a mount to bob.shore.mbari.org, there is no equivalent URL on dods.mbari.org.  That might be fine, we will find out in a minute.
#### The /ssds/data URL on ssds.shore points to the ssds share on iagdata which is accessible through dods.mbari.org from the /data/ssds share.  So these are equivalent:
{noformat}
http://ssds.shore.mbari.org/cgi-bin/nph-dods/ssds/data
{noformat}
equals:
{noformat}
http://dods.mbari.org/cgi-bin/nph-nc/data/ssds/
{noformat}
There is a problem though that on the dods.mbari.org side, there is a permissions denied in trying to access it.  However, I don't think we really need this share and it would be nice to remove it if possible.
#### That last one also applies to the rss and xml directories
#### The ssds/rawpackets and transmogrify urls point to the raw packet and transmogrify share on bob and is not available through dods.mbari, but that should be OK.  I will find out shortly.
### Now that we have an idea of how they are mapped, let's take a look at the DataContainer's and their base uriStrings to see if they point to any nph-dods urls.  Since these are the same broken linked files that I found above and they cannot be mapped due to duplicate uriString constraint, I will just leave the uriStrings for DataContainers alone.
### For the DataContainer dodsUrlString, I can query to find any current dods urls that point to ssds.shore using:
{noformat}
select * from ssdsdba.DataContainer where dodsUrlString LIKE '%nph-dods%'
{noformat}
Since this returned no results, we should be fine on the data container side of things (I think we did that move earlier).
### We need to do the same for any resources we find and search the uriString for nph-dods:
{noformat}
select * from ssdsdba.Resource where uriString LIKE '%nph-dods%'
{noformat}
Which returned no results so we are good there.
### Also check software
{noformat}
select * from ssdsdba.Software where uriString LIKE '%nph-dods%'
{noformat}
Which also returned no results.
## Now, we have all nph-dods urls that point to ssds.shore removed (except for the broken 1255) and a CNAME change should work if we point ssds.shore to new-ssds.  Before we do that though, we must make sure all HTTP accessible shares on predator are available on new-ssds at the same base URL (i.e. new-ssds.mbari.org/ should be the equivalent of ssds.shore.mbari.org from an HTTP directory sharing standpoint. So, the following HTTP shares are available on ssds.shore:
### http://ssds.shore.mbari.org/auvctd/ (which is the mount of AUVCTD on Tornado)
### http://ssds.shore.mbari.org/clients/ (which is a broken link)
### http://ssds.shore.mbari.org/data/ (which is the mount to the data volume on bob.shore.mbari.org).
### http://ssds.shore.mbari.org/ssds/data/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/data/)
### http://ssds.shore.mbari.org/ssds/rawpackets/ (which is a link through the 'data' mount to the rawpacket on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/rss/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/rss/)
### http://ssds.shore.mbari.org/ssds/transmogrify/ (which is a link through the 'data' mount to the transmogrify directory on bob.shore.mbari.org)
### http://ssds.shore.mbari.org/ssds/xml/ (which is a link through a mount to tornado.shore.mbari.org/iagdata/ssds/xml/)
## So if we look at them one-by-one:
### http://ssds.shore.mbari.org/auvctd/ does not have an equivalent on new-ssds, but I have a trouble ticket into I.S. to get that mounted.
### http://ssds.shore.mbari.org/clients/ since it is a broken link, I am not worried about making it available through new-ssds.
### http://ssds.shore.mbari.org/data/ I am hoping to not have any links pointing to this, so hopefully I can not make that share available.
### http://ssds.shore.mbari.org/ssds/data/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rawpackets/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/rss/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/transmogrify/ I am hoping I can get rid of this
### http://ssds.shore.mbari.org/ssds/xml/ I am hoping I can get rid of this
## So let's start with the DataContainer uriStrings (I am going to ignore DODS URLs since they were done).  I ran the following search:
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/auvctd%'
{noformat}
I get 4692 results.  As long as I can get the auvctd mount working on new-ssds, the CNAME should fix these.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/clients%'
{noformat}
This returned 0 results, so we are good to get rid of it.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/data%'
{noformat}
Again, 0 results.
{noformat}
select * from ssdsdba.DataContainer where uriString LIKE 'http://ssds.shore.mbari.org/ssds/data/%'
{noformat}
Returned 1278 entries. All the other /ssds/* urls returned nothing so we are good there. Looking at the Resource table, it looks like there are uriStrings that point to /ssds/data and /ssds/xml, but they all look very out of date.  There were no uriStrings in the Software table that pointed to the ssds.shore url so we are good there.  So the big question becomes can we just remove all references to those old shares from the metadata since I think most of those have been reprocessed anyway?  I have contacted Mike McCann about it.  If that is the case I can get rid of:
### ssds share/url on dods.mbari.org
### All the dods and http share/urls from ssds.shore.mbari.org
### All of the data housed in the iagdata/ssds share on tornado
Great, got the OK from Mike, so I can do all this and then we can go back and clean out the DB of any DataContainer, DataProducers, and Resources that are associated with these URLs.  COOL!
### One small change, there are a handful of Resources that are XML files for data streams.  Those might be useful, so I could copy those over the current Ruminate xml share on new-ssds and update the URLs to point to them there.  Actually it looks like they have already been copied, probably when I moved to new-ssds, so I just need to update the URLs with:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://ssds.shore.mbari.org/ssds/xml','http://new-ssds.mbari.org/data/ssds/ruminate/xml') where uriString like 'http://ssds.shore.mbari.org/ssds/xml%'
{noformat}

h3. new-ssds.mbari.org

# Now, I currently have ruminate running on new-ssds as a message driven bean that is writing the XML files to a local directory /data/ssds/ruminate/xml.  This really should be stored on the /tornado.shore.mbari.org/ssdsdata/ssds/ share under something like: /tornado.shore.mbari.org/ssdsdata/ssds/ruminate/xml.  This means that I need to get a read-write share mounted from /tornado.shore.mbari.org/ssdsdata/ssds/ruminate that I can mount on new-ssds.  If I can do this, I can then point any urls to the /ssdsdata/ssds/ruminate url on new-ssds and turn off the http share to the local /data/ssds/ruminate directory.  The same goes for the /data/ssds/generated/gps directory.
## There were security concerns (rightly so) about setting up a write share through the firewall, so instead, we setup a copy to run every 10 minutes and copy all files from the /data/ssds/ruminate/xml to the tornado /ssdsdata/ssds/ruminate/xml directories.  Also, a similar copy was setup for /data/ssds/generated/gps.  This means that any URLs that used to point to:
{noformat}
http://new-ssds.mbari.org/data/ssds/ruminate/xml
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml
{noformat}
and
{noformat}
http://new-ssds.mbari.org/data/ssds/generated/gps
{noformat}
should point to
{noformat}
http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps
{noformat}
The SQL for that to happen is:
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/ruminate/xml','http://new-ssds.mbari.org/ssdsdata/ssds/ruminate/xml') where uriString like 'http://new-ssds.mbari.org/data/ssds/ruminate/xml%'
{noformat}
and
{noformat}
UPDATE ssdsdba.Resource set uriString = REPLACE(uriString,'http://new-ssds.mbari.org/data/ssds/generated/gps','http://new-ssds.mbari.org/ssdsdata/ssds/generated/gps') where uriString like 'http://new-ssds.mbari.org/data/ssds/generated/gps%'
{noformat}
The second query was not necessary as it did not have any entries.  After running those, I rebuilt the ssds-ruminate.jar with the updated url bases and deployed to new-ssds.  Since this effectively removes all need of the http://new-ssds.mbari.org/data link, I removed that share from the http server on new-ssds as well.
{note:title=While I was there}
While I was updating ruminate, I changed the jboss.xml that deploys with ruminate and changed the entry:
{noformat}
                <MaximumSize>15</MaximumSize>
{noformat}
to
{noformat}
                <MaximumSize>1</MaximumSize>
{noformat}
Which should effectively make the RuminateMDB a singleton which should alleviate our deadlock issues that we were having (at least at Ruminate step).  
{note}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915259</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4948018</id>
<property name="body"><![CDATA[h1. SSDS Project Documentation

h5. Abstracts and Proposals
# [2008 Abstract] ([Word|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.doc])([PDF|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback (PDF)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure (Excel)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/SSDS_Hardening_WBS.xls]
# [2008 Proposal (Word)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Docs/Project.Proposal/900823_SSDS_Hardening.doc]

h5. Project Schedule
# [OmniPlan Document (HTML)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/Schedule/index.html]
# [OmniPlan Document (ZIP)|https://alfresco.mbari.org/alfresco/webdav/Projects/900823_SSDS_Hardening/SSDS%20Hardening.zip]

h5. Tasks
# [Tasks]

h5. Design
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]

h5. Developer
# [Installation and Development]

h5. Operational
# [Mooring Processing]
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">4915255</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">3179956</id>
<property name="body"><![CDATA[These are documents related to the SSDS Project:

Project Docs
# [2008 Abstract] ([Word|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/96885694-4442-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.doc])([PDF|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/2e77de22-4442-11dc-b8f8-b9495485390d/823_SSDS_Hardening_2008.pdf])
# [2008 Abstract Presentation] ([PPT|https://oceana:8443/alfresco/download/attach/workspace/SpacesStore/7c24b47c-4443-11dc-b8f8-b9495485390d/SSDS_Hardening_2008.ppt])
# [2008 Abstract Feedback|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/9a595478-4445-11dc-b8f8-b9495485390d/900823_2008%20Abstracts_MT_Feedback.pdf]
# [2008 Work Breakdown Structure|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/19836fd5-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_WBS.xls] (Excel Spreadsheet)
# [2008 Proposal|https://oceana.shore.mbari.org:8443/alfresco/download/attach/workspace/SpacesStore/3517d562-4604-11dc-b8f8-b9495485390d/SSDS_Hardening_Proposal_2008.doc]

Procedures
# [Instrument Swap on Oasis Mooring]
# [OASIS Mooring turn]

Design Docs
# [Requirements|ProjectRequirements]
# [User Interfaces|UserInterfaces]
# [Developer Docs]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">3114484</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10387742</id>
<property name="body"><![CDATA[This is the procedure to take when OSG swaps an instrument on an OASIS mooring in order to keep the metadata and data all lined up in SSDS.  The easiest way is to try to do these steps exactly when they actually do the instrument swap.  The reason is that due to the fact that the data from the instrument is downloaded to the same file in the OASIS directory so there is no way (currently) to automate some sort of notice that the instrument has been swapped.  An external process reads that raw data file from the instrument, looks up the device ID from a shore-side configuration file and then publishes that data to SSDS under that device ID.  If the timing is not right, some extra steps need to be taken.  These steps will assume that the timing is correct and I will add steps at the end in case this is being done after the swap happened (usually the case).
# Get new device ID of the new instrument to be installed.
# Check out the XML for that instrument from the 'puckxml' project in CVS.
# Use an XML editor like XML Spy or oXygen to open the XML file.
# Make sure the schema location at the top of the XML file points to:
## [http://new-ssds.mbari.org/ssds-docs/xml/schema/SSDS_Metadata.xsd]
# Run the editor's validation on the XML.
# If it does not validate, fix errors
# Remove any deployment attributes from the <Deployment> tag.  For instance any nominalLat/Lon/Depth. {color:#ff0000}The one exception is the nominalDepth, if it is known please set it{color}.
# If the <Deployment> tag has a 'name' attribute, make sure it does not have any deployment specific information in it.  For example, 'ISUS Deployment' is better than 'M2 ISUS Deployment'.  The reason for removing any deployment information from the XML is so that when the device moves to a different mooring, the user should not have to edit the XML.  The goal is to get all the XML to a point where it never needs to be edited when an instrument is deployed (unless something in the way the data stream is generated from the instrument changes).
# Go to the SSDS Device pages and verify that the all the device information (mfg, model, serial number, name, type, etc.) matches what is currently in SSDS.  If any of those are different it will update the device information in SSDS when the XML comes in the data stream.
# Verify RecordDescription and RecordVariables look correct.  I usually go to the raw data pages in SSDS and bring up the last few packets from the device just to verify that the number of columns and bufferSeparator look about right.
# Check any changes to the XML back into CVS.
# Copy the XML to the \\Tornado\ssdsdata\mooring\(m1\|m2)\YYYY\xml directory
# Go to the \\Tornado\ssdsdata\mooring(m1\|m2)\YYYY\cfg directory.
# This next step is the one that needs to be timed with the mooring turn.  When the old instrument is shutdown:
## Open the ssds.cfg file in a text editor
## Find the line that shows the currently deployed instrument and copy it to a line just below it.  For example, if we are replacing the GPS, it might look like this before:
{panel:title=Before Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
and this after:
{panel:title=After Copy}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# Now change the new line to have the {color:#cc0000}{+}correct device ID{+}{color} *and* the {color:#cc0000}{+}correct XML{+}{color} file URL
{panel:title=After Device ID update}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,,,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
# To clean up the previous deployment information, put start and end dates after the XML URL
{panel:title=After Adding Start/End dates}
{noformat}
instrument = PCO2,1471,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1471.xml
instrument = Metsys,1480,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1480.xml
instrument = GPS_TYPE3,1416,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1416.xml,2007/04/25 16:21:58,2007/08/01 10:00:00,TransformGPS
instrument = GPS_TYPE3,1511,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1511.xml,,,TransformGPS
instrument = Spec_PRR,1420,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1420.xml
instrument = ADCP,1417,http://dods.mbari.org/data/ssdsdata/mooring/m2/2007/xml/1417.xml
{noformat}
{panel}
(Be careful on the format for the start and end date strings.&nbsp; Leading 0s are required.)
# Save the cfg file.
{note:title=Saving the file will make the change take hold}When the ssds.cfg file changes (saved) is when the OASIS2SSDS processing will pick up the instrument change.  Now, the next time it runs it will pick up the instrument change, grab the XML file from the 'xml' directory and publish it to SSDS.  It will then publish all data under the new device ID.
{note}
# Edit the metadata in SSDS to put a close date on the old instrument deployment in SSDS.  Currently I do that using Enterprise Manager.

h5. If this is being done after the fact the next steps will also need to be taken.

# After the new deployment shows up in SSDS (which can take up to 5 minutes after the OASIS2SSDS has completed), the start time for the new deployment will need to be edited to match the actual time the instrument was swapped.
# Also because the data was being published under the incorrect device ID, it will need to be moved from one database table in SSDS_Data on Solstice to another table.
## The first thing that I do is grab the timestamp from the last packet sent from the old device in the raw data page on SSDS.
## For example, I go to: [http://new-ssds.mbari.org:8080/ssds/siamRawDataStep1.jsp] and enter the old device ID and set the number of packets back to make sure it goes far enough back to cover the actual time of the instrument swap.  Then click on 'Next->'.
## Once the raw data shows up, find the last packet from the old device and grab the 'SIAM Timestamp' value (not the date/time) as that will be used in the Enterprise Manager query.
## Open Enterprise Manager and navigate to the 'SSDS_Data' database on Solstice.
## Browse the tables and find the table with the device ID of the old device and right click on it and select 'Open Table->Return all rows'.
## Click on the 'SQL' button in Enterprise Manager to bring up the SQL pane.  It should show the basic query which should look something like this:
{noformat}
SELECT     *
FROM         [1416]
{noformat}
## Now add the where clause to pick only the data that is after the timestamp you grabbed from the last packet on the web page.
{note:title=Timestamps in SQL are in Seconds}A quick note here, the 'SIAM Timestamp' on the raw data page is actually in milliseconds and the database column is in seconds so you will have to remove the last three digits of the 'SIAM Timestamp' before putting it in this query.
{note}
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Run this query by clicking the run button '\!' in Enterprise Manager.
## Look over the results to make sure they look about right (usually you are looking for the length of the return which should be much shorter).  You can actually use a count query to see how many rows this query will return.  A count query would look like:
{noformat}
SELECT    count(*)
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
## Once you know the query is correct (also compare sequence number in query return and the raw data page), copy it to the clipboard and close the query window in Enterprise Manager.
## Navigate to the table of the device you want to copy the data into and right click and select 'All Tasks->Import Data...' which will fire up the DTS wizard.
### Click on 'Next>'
### For the Data Source database choose Solstice
### Select the 'SSDS_Data' database (note you should have permissions to do all this and use your windows authentication)
### Click on 'Next>'
### The destination configuration should be already to go (Solistice and SSDS_Data database).
### Click on 'Next>'
### Select 'Use a query to specify the data to transfer'
### Click on 'Next>'
### Paste the query from your clipboard into the 'Query Statement' window (You can click on 'Parse' if you want a quick sanity check)
### Click on 'Next>'
### Click on the 'Results' entry under the 'Destination' column which will enable a drop down box.
### Choose the table of the newly installed device where you will be copying the data to.
### Click on 'Next>'
### Click on 'Next>'
### Click on 'Finish' which will copy the data.
### Once that is done, open the table of the old instrument and the SQL pane so that we can construct the delete query on the old data.
### Paste in the select query and verify it is the same data you copied over:
{noformat}
SELECT     *
FROM         [1416]
WHERE timestampSeconds > 1185963023
{noformat}
### If it looks good, click on the 'Change Query type ...' button in Enterprise Manager and select 'Delete'.  This will change the query to a delete query.
### Run the query by click on the run '\!' button.  That will remove all the data from the old instrument.

That's it ... whew\!

Kevin Gomes (August 3, 2007)]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10354987</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944587</id>
<property name="body"><![CDATA[]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911821</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944588</id>
<property name="body"><![CDATA[I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

A more detailed view with examples of configuration files can be seen here:

{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=L}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911822</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944590</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

A more detailed view with examples of configuration files can be seen here:

{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=L}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911824</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944593</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

In order to meet these requirements there are several components that must be developed:
# [Supporting Services]
# [GUI Components]

h3. Supporting Services


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

A more detailed view with examples of configuration files can be seen here:

{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=L}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911828</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944594</id>
<property name="body"><![CDATA[{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911829</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944584</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

Once this is configured the way the system works looks like the following figure:

{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=L}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911817</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944604</id>
<property name="body"><![CDATA[# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911840</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944603</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

h3. [Related Resources]

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911839</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944606</id>
<property name="body"><![CDATA[# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911842</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944605</id>
<property name="body"><![CDATA[# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911841</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944608</id>
<property name="body"><![CDATA[This is the index page that lists all the various services in the SSDS and links to their respective documentation:

# [Data Producer Services]
## [createDuplicateDeepDeployment|Data Producer Services#createDuplicateDeepDeployment]
# [Data Services]
## getDataStreamProperties]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911844</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944607</id>
<property name="body"><![CDATA[{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911843</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944610</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Graphical User Interfaces

h5. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

h3. Programmatic Interfaces (APIs)

h5. Matlab Integration
Users can interact with the SSDS programatically using Matlab.  Instructions for doing this are found on the page [Matlab 2008a Integration].

h3. Other Resources

For a list of other resources used in designing user interfaces to the SSDS, please see [Related Resources]

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911846</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944596</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

In order to meet these requirements there are several components that must be developed:
# [Supporting Services]
# [GUI Components]

h3. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911831</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944595</id>
<property name="body"><![CDATA[{panel:title=getDataStreamProperties}
h5. Background
The desire it to have a service that can characterize a DataStream from an instrument.  This would allow for easier monitoring of instruments on the network.  
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|

h5. The Interface

The things that the user would want to know are:

||Return||Parameters||
|Date and time of last packet received|* Device ID
* RecordType to search for (nothing/default means most recent packet)|
|Total Number Of Records|* Device ID
* RecordType to search for (nothing/default specified means all packets)|
|Data Gaps|* Device ID
* RecordType
* Time window over data to search for gaps
* Gap criteria
** Type of gap
*** Time only
*** Sequence number only
*** Time and sequence number
** Ways to specify gap
*** Margin on gap in milliseconds (anything longer than gap + margin will be considered a possible gap)
*** Let service calculate gap constraints (calculate average time between sample)
**** Number of points to use (points back from most recent packet)
**** Or time window to use (start to end time)
*** Specify gap constraints
**** Gap in milliseconds|

So the API interface looks like:
{code:title=getDataStreamProperties}
// Type of criteria to use for finding gaps
public final static String TIME_ONLY_GAP = "timeGap";
public final static String SEQ_ONLY_GAP = "seqGap";
public final static String TIME_SEQ_GAP = "timeSeqGap";

// The method of specifying the gap
public final static String SERVICE_CALCULATED = "serviceCalculated";
public final static String USER_SPECIFIED = "userSpecified";

getDataStreamProperties(
     Long deviceID,                     // The ID of the Device to get the properties for
     Long recordType,                   // The RecordType that will be singled out (devices
                                        // can send out more than one RecordType)
                                        // 0 = Metadata Packets
                                        // 1+ = Device specific record types
     Boolean checkForGaps,              // A Boolean that indicates if the caller wants to
                                        // have the service check for data gaps (true means
                                        // the service will check for gaps and false/null
                                        // means it will not
     Date startGapCheckWindow,          // The start date of the window over which to search for
                                        // gaps.
     Date endGapCheckWindow,            // The end date of the window over which to search for gaps.
     String typeOfGap,                  // One of three types: "timeGap", "seqGap", "timeSeqGap"
     Long marginMillis,                 // This is the number of milliseconds that are used as 'slop'
                                        // around the specification for a gap. In other words, if
                                        // this is > 0, the service will consider any time between 
                                        // samples that is less than the specified gap plus this margin,
                                        // it will assume that it is not a gap condition.  This is to
                                        // prevent false positives when the sample timestamps aren't exactly
                                        // on the interval.
     String gapSpec,                    // There are two ways to specify a gap: 
                                        // "serviceCalculated" or "userSpecified"
     Long numberOfRecords,              // If the call specifies SERVICE_CALCULATED and this
                                        // is greater than 0, the service will use 'numberOfRecords'
                                        // most recent records of the specified RecordType
                                        // in calculating the average time between samples
     Date intervalCalcStartWindow,      // This is the date that starts the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this is ignored.
     Date intervalCalcEndWindow,        // This is the date that ends the window over which the data
                                        // will be used to calculate the average time between samples
                                        // NOTE: If numberOfRecords is specified, this will be used as
                                        // the endtime and then the service will use the numberOfRecords
                                        // before this time as the data to calculate the average
                                        // time interval.
     Long gapInMillis                   // If the gapSpec is USER_SPECIFIED, then the service will use
                                        // this number of milliseconds as the gap for identifying gaps.
)
{code}

With a return that has the format of:
Properties Objects with properties:
||Property Name||Value||
|lastPacketDateTime|This is the date and time of the last packet received|
|totalNumberOfRecords|This is the total number of records for the parameters specified|
|numberOfFuturePackets|This is the number of packet that appear in the future.  This should be zero and if they are not, there could be bad data|
|averagSampleIntervalInMillis|This is the number of milliseconds that the service used to find data gaps|
|marginInMillis|This is the number of milliseconds as a margin that the service used to find data gaps|
|numRecordsSearchedForGaps|This is the number of records that were searched through while trying to find gaps using the gap criteria|
|dataGap1Start|This is the date and time of start of the first possible gap in the data|
|dataGap1End|This is the date and time of end of the first possible gap in the data|
|.|.|
|.|.|
|.|.|
|dataGapNStart|This is the date and time of start of the Nth possible gap in the data|
|dataGapNEnd|This is the date and time of end of the Nth possible gap in the data|

h5. Java EJB client
Under construction

h5. REST client
If you want to use the REST-style interface the HTTP call would looks something like:
{code}
http://new-ssds.mbari.org:8080/servlet/DataAccessServlet?objectToInvokeOn=SQLDataStreamRawDataAccess&method=getDataStreamProperties
&p1Type=Long&p1Value=1300
&p2Type=Long&p2Value=1
&p3Type=Boolean&p3Value=true
&p4Type=Date&p4Value=2008-12-00T00:00:00Z
&p5Type=Date&p5Value=2008-01-00T00:00:00Z
&p6Type=String&p6Value=timeGap
&p7Type=Long&p7Value=5000
&p8Type=String&p8Value=userSpecified
&p9Type=Long&p9Value=10
&p10Type=Date&p10Value=
&p11Type=Date&p11Value=
&p12Type=Long&p12Value=10000
{code}
And the return might look something like
{code}
java.util.Properties{}
{code}

h5. Web Service Client
Under construction
{panel}]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911830</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944598</id>
<property name="body"><![CDATA[Requirements documents for SSDS development:

# [CIMT Requirements]
# [MOOS Science Expermiment Requirements|MSERequirements]

h3. Consolidated Requirements

||Number||Requirement||Description||
|1.0|User can merge data from different sources|This should be able to be done by the user selecting variables from various sources and a time frame and then SSDS will return a merged data set in various formats. See John's [pseudo-code|^merge_pseudocode|Pseudo-code for merging] and [Perl script for merging|^merge.pl|Example of perl script for data merging] script.|
|2.0|Data conversions can be done by SSDS|SSDS should support user defined data transformations.  CTD values to salinity is the golden example of this|
|3.0|SSDS should connect up/work with AOSN|?|
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911833</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944599</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911834</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830523</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

h3. Documents
# We got a document from science about QC plots which is attached here [Mooring QC Plot Requirements (Word)|^Mooring_Quality_Contr#F4B3C.doc|Mooring QC Plot Requirements (Word)].
# Also a spreadsheet about data processing and analysis for the instruments on CIMT [Data Processing and Analysis for CIMT (Word)|^Data_Processing_Analysis.doc]

h3. Meeting Notes
# [2004-04-20 CIMT SSDS Meeting Notes]

h3. Requirements]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797754</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944601</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

h3. [Related Resources]

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911837</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944613</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911849</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944614</id>
<property name="body"><![CDATA[{mockup:Device Inspector Mockup|1}

This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911850</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944617</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|2}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911853</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944615</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|1}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911851</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944635</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|5}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911871</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944627</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|3}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911863</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944633</id>
<property name="body"><![CDATA[This particular user interface is provided to the user so that they can explore a particular device to find out more about it and its current operation.  Here is the information to be conveyed to the user by this interface:

# Device Manufacturer
# HTTP Links to external device information
# Current location
# Current parent
# List of all deployments (user should be able to select deployment and show location on map)
# XML Template for SSDS Metadata for deployment
# Data streams coming from device (show variables, raw data)
# Quick look plots of data
# Statistics on data stream from instrument (gaps, last time heard from)
# Associated metadata

Here is a mock up of what the device inspector might look like:

{mockup:Device Inspector Mockup|4}
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911869</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">13369347</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Graphical User Interfaces

h5. Technology for the SSDS User Interfaces 

I had been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  An evaluation of various technologies and how they are configured to work in a J2EE environment can be seen here:

[RIA Technologies for the SSDS]

Here is a list of the GUI/Pages that were developed to meet the user's requirements:

# [Device Inspector]


h3. Programmatic Interfaces (APIs)

h5. Matlab Integration
Users can interact with the SSDS programatically using Matlab.  Instructions for doing this are found on the page [Matlab 2008a Integration].

h3. Other Resources

For a list of other resources used in designing user interfaces to the SSDS, please see [Related Resources]

]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">13336579</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830448</id>
<property name="body"><![CDATA[Requirements documents for SSDS development:

# [MOOS Science Expermiment Requirements|MSERequirements]
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797679</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830451</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

# We got a document from science about QC plots which is attached here.]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797682</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830453</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

# We got a document from science about QC plots which is attached here [Mooring QC Plot Requirements (Word)|^Mooring_Quality_Contr#F4B3C.doc|Mooring QC Plot Requirements (Word)].]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797684</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830456</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

h3. Documents
# We got a document from science about QC plots which is attached here [Mooring QC Plot Requirements (Word)|^Mooring_Quality_Contr#F4B3C.doc|Mooring QC Plot Requirements (Word)].
# Also a spreadsheet about data processing and analysis for the instruments on CIMT [Data Processing and Analysis for CIMT (Word)|^Data_Processing_Analysis.doc]

h3. Meeting Notes
# [2004-04020 CIMT SSDS Meeting Notes]

h3. Requirements]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797687</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830455</id>
<property name="body"><![CDATA[These are the science requirements that were gathered for the CIMT deployment.

# We got a document from science about QC plots which is attached here [Mooring QC Plot Requirements (Word)|^Mooring_Quality_Contr#F4B3C.doc|Mooring QC Plot Requirements (Word)].
# Also a spreadsheet about data processing and analysis for the instruments on CIMT [Data Processing and Analysis for CIMT (Word)|^Data_Processing_Analysis.doc]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797686</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">9830460</id>
<property name="body"><![CDATA[Issues Identified Before and During 2004.04.20 CIMT/SSDS Meeting

# Q: One of the items is to pass data to/from the SSDS. Does that mean that we (CIMT) are responsible for reproducing the same types of plots and such that MBARI is already creating internally?  Or is it possible to combine these two processes?  
## A: Both processes can be combined.  The "passing data from and to" is to enable automated non-SSDS processing.
# #13 on the prioritization list should be bumped up a bit...if we can't get through the firewall to see the data we are going to get negative feedback from NOAA.
## Understood. Is in fact in progress.
# Are we planning on a watch circle type plot for GPS?
## Yes (though note it is in the custom plots category, Priority #16).
# Is tic mark beginning of day? 
## Yes, midnight on that day. These formats can be changed.
# How is development affected by selection of particular plotting package (e.g., JFreeChart) to support SSDS requirements? 
## It affects how our internal services work (e.g., the callable interface we're using for this demonstration), but users are expected to download data (via TBD interfaces) to work with more advanced applications.  
# How will user know what URL to specify to get what they want?  
## At first by asking us, but soon enough by filling out a query form (which will then generate a URL, and the URL can be modified and reused).
# Concern about query page being time-oriented.  Can't we make it easy to do this by region too (i.e., lat/lon/depth)?  You do need to consider this for CIMT, but a simple (nominal) concept is probably all we should do at first.  It doesn't have to be embedded in data, but incorporated in header of a plot. SSDS should eventually be able to query on these 4 parameters: time, lat, lon, depth.
## Points well taken. Please note this is hard, and not on the priority list.
# How do you envision getting data from this system on a recurring basis?  This could be used, for example, to connect two data systems together. This is Likely to be common.
## We have to design this feature (see Priorities #5 and #8).
# Would be nice to be able to give feedback about the data, so that the feedback lives with the data.  
## This is a significant operational challenge across the board at MBARI.  But, the architecture we have could be tuned to such a thing.  (There are 3 distinct parts to this request; routine automated QC flagging; injecting comments during post-processing, manually or automatically; and user feedback on existing data. The last might be accomplished by publishing the "instrument owner" with the plots.)  Note this is not on the priority list.
# Why can't we query more/better/sooner?  How about directly querying the database?  Point and click query access can wait, but developer queries must be supported soon.  (When will they be available?)
## An interface which can support at least some developer queries will be available sometime 'soon' (at its most basic possibly within a few weeks).  That kind of interface is implied in Priorities #3, #5, #8, #11, #12, and #16.  The query documented by Priority #14 is the point-and-click type.
# Processing data internally, by moving currently external processing into SSDS, is desirable (e.g., for Metsys and other Bahr data).
## We are evaluating all the external processing requirements before proceesing on Priority #8, but my (John G) first approach is to work with existing interfaces as much as possible, for the sake of speed.
# Add lookup by platform name to device table front end.
## Good idea.  Have it mind, but not on the priority list.
# Not clear how to get to a specific data variables/data sets. An interface to 'query for data' is needed, but it isn't on the priority list. (How to describe this need, in the context of the priority list, isn't clear.)
## We will be better able to respond to this, and consider what priority it should have, at the next User Story meeting.
# What time frame are you likely to have some of this work done -- do you even know?
## We have a decent idea.  We expect to be one more step toward a final solution for #8 and #9 by the next User Story meeting on 5/6/04, with a prototype to review.  Also at that meeting, we may have significant progress on one or all of the following (current status in parentheses):
 #10: (solution in mind, implementation in progress)
 #11: (prototype demonstrated today, wider access intended by 5/6)
 #12: (notional solution in mind)
 #13: (PC in house, final architecture still undetermined)
 #16: (none currently developed, but this wouldn't be hard, especially with a collaborator)
Status of infrastructure items:
 #1: Done for many cases, some cases still in progress.
 #2: In progress, 5 MTM instruments described.
 #3: Example demonstrated today, some enhancements needed for end users, and still needs to be "released" and possibly put service outside firewall.
 #4: Coding can now begin once agreed SIAM metadata interface is documented.
 #5: Prototype developed, considerable standardization remains.
 #6: In research.
 #7: No activity.
]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">9797691</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944575</id>
<property name="body"><![CDATA[{gliffy:name=Flex Client and BlazeDS Components|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=L}
This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

Once this is configured the way the system works looks like the following figure:

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911808</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944574</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

Once this is configured the way the system works looks like the following figure:

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911807</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">10944573</id>
<property name="body"><![CDATA[This page contains information related to the design of the user interfaces for SSDS.

h3. Requirements

So what exactly are the most useful interfaces that can be placed on SSDS for users to interact with it?  Here are some questions that have been asked from day one of the project.
# I want to be able to edit the metadata in the SSDS system.
# I want a snapshot view of all the currently deployed instruments and what their data stream are doing (this should have links to the raw data, instruments configuration and device information).
# I want data/plot of variable X (i.e. salinity) from platform Y and time frame.
# I want data/plot of variable X (i.e. salinity) from geospatial location and time frame.
# I want a 'shallow' operational view of current platforms and instruments
# I want to get access to 'all' data from a device
# I want to find all data of mime type X from a device or platform
# I want to see all currently deployed devices in a geospatial location (box)

h3. Supporting Services
In order to answer the above questions, the following services were defined:

* Get Data Stream Properties
||Parameter||Description||Options||Default Value||Required||
|Device ID|The SSDS ID of the device that the user wants information about|Any SSDS ID|N/A|Y|
|Number Of Samples To Average|The number of samples back that the service is to use to calculate the average sampling interval|Any Number|10|N|
|Check for gaps|Is a flag that tells the service to try to find data gaps based on some average sample interval|True/False|False|N|
|Gap Interval|Is the number of milliseconds to use as the sampling interval to search for gaps.  If this is specified it will override the average gap calculated by the service|Any number of milliseconds|N/A|N|

Result is a listing of properties about the data stream
||Property Name||Type||Description||
|Latest packet timestamp|Date/Time|Date and time of latest packet|
|Total number of packets|Number|The total number of packets received by this device|
|Average sample interval|Number of Milliseconds|The number of milliseconds, on average, between samples|
|Number of record types|Number|The number of record types that have been sent by the device|
|Number of parents|Number|This is the number of parent that this device has sent packets through|
|Number of timestamps in the future|Number|This is the number of records that have timestamps in the future, this is bad and indicates corrupt data|
|Data gap 1 start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap 1 end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|
|.| | |
|.| | |
|.| | |
|Data gap N start|Date/Time|The timestamp of the start of a possible data gap (last timestamp of packet before gap)|
|Data gap N end|Date/Time|The timestamp of the end of a possible data gap (first timestamp of packet after gap)|


h3. Technologies for Rich Internet Applications (RIA) 

I have been using Java Server Faces for the web application work and have been less than thrilled with it.  It just is not that straightforward to do hard stuff.  For this reason, I started to look around at RIA options.  Here are some:

# Google Web Toolkit (GWT)
# Flex 3 and BlazeDS

h5. GWT 

h5. Flex 3 and BlazeDS

I looked at Flex 3 because I have seen some very compelling uses of it and it seems to integrate well with Java development (ant, J2EE, etc.).  BlazeDS is a piece that goes on the server to expose Java objects as Flex services.  So, for SSDS, we can expose the EJB's to flex clients by setting up the system in the following way:

{gliffy:name=SSDS Flex Web Application Logical Deployment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

The development environment must work in both Ant and FlexBuilder.  Here is the diagram that explains how all that works:

{gliffy:name=Flex_Development_Environment|space=SSDS|page=UserInterfaces|pageid=91|align=center|size=S}

h3. Related Resources

# *Data Search and Access* - This section focuses on finding (and maybe getting) the data. Within each category, the examples are roughly organized from more traditional to more innovative.
## [MBARI's Cruise (expd) Interface|http://mww.mbari.org/expd/log/postcruise.asp?search=advanced]
## [MBARI's Samples Database|http://mww.mbari.org/samplesDB/Queries] 
## [Structured data search|http://www.mbari.org/staff/graybeal/notions/SSDSDataQueryPage.html] Similar concept, for SSDS data
## [Quick data concept|http://www.mbari.org/staff/graybeal/notions/SSDSQuickDataPage.html] Combines simple and advanced access to data
## [Mike Godin's AOSN/MB06 interface for finding data via metadata|http://aosn.mbari.org/moqua] 
## [VARS on GoogleMaps|http://ssdsprojpc.shore.mbari.org/googlemaps/] Andrew Chase's example of plotting our data on GoogleMaps (If service isn't up, check out).
# *External Oceanography Examples*
## [SeaCOOS|http://seacoos.org/Data%20Access%20and%20Mapping] typical IOOS Regional Association site
## [CaroCOOPS|http://nautilus.baruch.sc.edu/carocoops_website/index.php] nice display of mooring sites
# *External General Example*
## [Google Maps|http://maps.google.com] points overlaid on lat/long (2 dimensions)
## [Google Earth|http://earth.google.com] latest cool view of the world (2 1/2 dimensions)
# *Data Visualization* - This section addresses interfaces for viewing the data.
## Overview
### [Oceanographic Visualization Overview|http://www.mbari.org/staff/graybeal/notions/OceanographicVisualization.pdf] White paper (PDF) of visualization techniques and examples.
## Workflow/Automated
### [Kepler project|http://kepler-project.org] Project that can automate science data workflows, including visualizations
# *3rd Party Application Integration*
## [Matlab 2008a Integration]]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">10911806</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">4489265</id>
<property name="body"><![CDATA[]]></property>
<property name="content" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">4456499</id>
</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">16</id>
<property name="body"><![CDATA[]]></property>
<property name="content" class="SpaceDescription" package="com.atlassian.confluence.spaces"><id name="id">18</id>
</property>
</object>
<object class="Label" package="com.atlassian.confluence.labels">
<id name="id">2</id>
<property name="name"><![CDATA[favourite]]></property>
<property name="owner"><![CDATA[kgomes]]></property>
<property name="namespace"><![CDATA[my]]></property>
<property name="creationDate">2006-10-17 21:48:40.373</property>
<property name="lastModificationDate">2026-02-04 08:33:05.020</property>
</object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8912969</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8912971</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911836</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">4456506</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911848</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">1179738</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">17858877</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911819</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">81</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8355981</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">80</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8061037</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8912969</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">841</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8912971</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">13926583</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">17858877</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">4456506</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10912280</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">9797689</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">80</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10356008</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8355981</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">81</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">5374184</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">91</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911819</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">3637922</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">1179945</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">5374184</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10356008</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8356090</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">1179945</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">13664436</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">841</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">9797681</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10912280</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">3637922</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797071</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">1179738</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797073</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">17236005</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797058</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797058</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8355863</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8061037</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">9797681</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">3637846</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">17236005</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911848</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">13926583</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">9797689</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10911836</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10356413</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10356413</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8356090</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10355890</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">8355863</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797071</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10355664</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10355664</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11240414</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11797073</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">11240414</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">10355890</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">91</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">13664436</property>
<property name="key"><![CDATA[socialbookmarkingurl]]></property>
</composite-id>
<property name="type">6</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
<object class="BucketPropertySetItem" package="bucket.user.propertyset">
<composite-id><property name="entityName"><![CDATA[confluence_ContentEntityObject]]></property>
<property name="entityId">3637846</property>
<property name="key"><![CDATA[isbookmark]]></property>
</composite-id>
<property name="type">5</property>
<property name="booleanVal">false</property>
<property name="doubleVal">0.0</property>
<property name="stringVal"/><property name="textVal"><![CDATA[]]></property>
<property name="longVal">0</property>
<property name="intVal">0</property>
<property name="dateVal"/></object>
</hibernate-generic>