merge Unified_Grid with ss_builds to 12.11.1-7

Former-commit-id: ab80625b5c573d8ab1350b4c251414ea036ef016
This commit is contained in:
Ben Steffensmeier 2012-10-24 13:18:55 -05:00
commit 6a9ff88b33
1089 changed files with 93710 additions and 13415 deletions

View file

@ -90,6 +90,23 @@
</max-perm> </max-perm>
</ini-substitutions> </ini-substitutions>
</memory-setting> </memory-setting>
<memory-setting>
<command-line-args>
<first-arg>-component</first-arg>
<second-arg>gfeclient</second-arg>
</command-line-args>
<ini-substitutions>
<max-memory>
<value>1536M</value>
</max-memory>
<max-perm>
<value>DEFAULT</value>
</max-perm>
</ini-substitutions>
</memory-setting>
</arch.x86> </arch.x86>
<arch.x86_64> <arch.x86_64>
@ -148,6 +165,23 @@
</max-perm> </max-perm>
</ini-substitutions> </ini-substitutions>
</memory-setting> </memory-setting>
<memory-setting>
<command-line-args>
<first-arg>-component</first-arg>
<second-arg>gfeclient</second-arg>
</command-line-args>
<ini-substitutions>
<max-memory>
<value>2048M</value>
</max-memory>
<max-perm>
<value>DEFAULT</value>
</max-perm>
</ini-substitutions>
</memory-setting>
</arch.x86_64> </arch.x86_64>
</cave-memory-settings> </cave-memory-settings>

View file

@ -276,6 +276,14 @@
<param name="feature" <param name="feature"
value="com.raytheon.uf.viz.kml.export.feature" /> value="com.raytheon.uf.viz.kml.export.feature" />
</antcall> </antcall>
<antcall target="p2.build.repo">
<param name="feature"
value="com.raytheon.uf.viz.npp.feature" />
</antcall>
<antcall target="p2.build.repo">
<param name="feature"
value="com.raytheon.uf.viz.collaboration.feature" />
</antcall>
<antcall target="cleanup.features" /> <antcall target="cleanup.features" />
</target> </target>
@ -407,6 +415,20 @@
</delete> </delete>
</then> </then>
</if> </if>
<!-- Remove 'com.raytheon.uf.viz.collaboration.product.feature' -->
<if>
<available
file="${basedir}/cave/p2/features/com.raytheon.uf.viz.collaboration.product.feature"
type="dir" />
<then>
<delete includeemptydirs="true">
<fileset
dir="${basedir}/cave/p2/features/com.raytheon.uf.viz.collaboration.product.feature"
/>
</delete>
</then>
</if>
</target> </target>
<taskdef resource="net/sf/antcontrib/antlib.xml" <taskdef resource="net/sf/antcontrib/antlib.xml"

View file

@ -20,8 +20,8 @@
--> -->
<bundle> <bundle>
<displayList> <displayList>
<displays xsi:type="d2DNSharpDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <displays xsi:type="nsharpSkewTPaneDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="d2DNSharpDescriptor" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <descriptor xsi:type="nsharpSkewTPaneDescriptor">
<resource> <resource>
<loadProperties loadWithoutData="true"> <loadProperties loadWithoutData="true">
</loadProperties> </loadProperties>

View file

@ -21,83 +21,83 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Adark/Davis AFB, AK (70454)" id="raobDavisAFB_AK" menuText="Adark/Davis AFB, AK (70454)" id="raobDavisAFB_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70454"/> <substitute key="stationId" value="70454"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Barter Island, AK (PABA)" id="raobBarterIsland_AK" menuText="Barter Island, AK (PABA)" id="raobBarterIsland_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70086"/> <substitute key="stationId" value="70086"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Bethel, AK (PABE)" id="raobRarotonga" menuText="Bethel, AK (PABE)" id="raobRarotonga"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70219"/> <substitute key="stationId" value="70219"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Barrow, AK (PABR)" id="raobBarrow_AK" menuText="Barrow, AK (PABR)" id="raobBarrow_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70026"/> <substitute key="stationId" value="70026"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cold Bay, AK (PACB)" id="raobColdBay_AK" menuText="Cold Bay, AK (PACB)" id="raobColdBay_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70316"/> <substitute key="stationId" value="70316"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kodiak, AK (PADQ)" id="raobKodiak_AK" menuText="Kodiak, AK (PADQ)" id="raobKodiak_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70350"/> <substitute key="stationId" value="70350"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fairbanks, AK (PAFA)" id="raobFairbanks_AK" menuText="Fairbanks, AK (PAFA)" id="raobFairbanks_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70261"/> <substitute key="stationId" value="70261"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Anchorage, AK (PAFC)" id="raobAnchorage_AK" menuText="Anchorage, AK (PAFC)" id="raobAnchorage_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70273"/> <substitute key="stationId" value="70273"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="King Salmon, AK (PAKN)" id="raobKingSalmon_AK" menuText="King Salmon, AK (PAKN)" id="raobKingSalmon_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70326"/> <substitute key="stationId" value="70326"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="McGrath, AK (PAMC)" id="raobMcGrath_AK" menuText="McGrath, AK (PAMC)" id="raobMcGrath_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70231"/> <substitute key="stationId" value="70231"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Annette Is, AK (PANT)" id="raobAnnetteIs_AK" menuText="Annette Is, AK (PANT)" id="raobAnnetteIs_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70398"/> <substitute key="stationId" value="70398"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nome, AK (PAOM)" id="raobNome_AK" menuText="Nome, AK (PAOM)" id="raobNome_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70200"/> <substitute key="stationId" value="70200"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kotzebue, AK (PAOT)" id="raobKotzebue_AK" menuText="Kotzebue, AK (PAOT)" id="raobKotzebue_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70133"/> <substitute key="stationId" value="70133"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="St. Paul Island, AK (PASN)" id="raobSTPaulIsland_AK" menuText="St. Paul Island, AK (PASN)" id="raobSTPaulIsland_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70308"/> <substitute key="stationId" value="70308"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shemya AFB, AK (PASY)" id="raobShemyaAFB_AK" menuText="Shemya AFB, AK (PASY)" id="raobShemyaAFB_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70414"/> <substitute key="stationId" value="70414"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yakutat, AK (PAYA)" id="raobYakutat_AK" menuText="Yakutat, AK (PAYA)" id="raobYakutat_AK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="70361"/> <substitute key="stationId" value="70361"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,105 +21,105 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dakar, Senegal (GOOY)" id="raobDakar_Senegal" menuText="Dakar, Senegal (GOOY)" id="raobDakar_Senegal"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="61641"/> <substitute key="stationId" value="61641"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sal, Cape Verde (GVAC)" id="raobSal_CapeVerde" menuText="Sal, Cape Verde (GVAC)" id="raobSal_CapeVerde"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="08594"/> <substitute key="stationId" value="08594"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Albrook, Panama (MABK)" id="raobAlbrook_Panama" menuText="Albrook, Panama (MABK)" id="raobAlbrook_Panama"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78808"/> <substitute key="stationId" value="78808"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Curacao (MACC)" id="raobCuracao" menuText="Curacao (MACC)" id="raobCuracao"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78988"/> <substitute key="stationId" value="78988"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="St. Maarten (MACM)" id="raobSTMaarten" menuText="St. Maarten (MACM)" id="raobSTMaarten"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78866"/> <substitute key="stationId" value="78866"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="San Andres Island (MCSP)" id="raobSanAndresIsland" menuText="San Andres Island (MCSP)" id="raobSanAndresIsland"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="80001"/> <substitute key="stationId" value="80001"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Santo Domingo, DR (MDSD)" id="raobSantoDomingo_DR" menuText="Santo Domingo, DR (MDSD)" id="raobSantoDomingo_DR"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78486"/> <substitute key="stationId" value="78486"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Grand Cayman, Cayman Is (MKCG)" id="raobGrandCayman_CaymanIs" menuText="Grand Cayman, Cayman Is (MKCG)" id="raobGrandCayman_CaymanIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78384"/> <substitute key="stationId" value="78384"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kingston, Jamaica (MKJP)" id="raobKingston_Jamaica" menuText="Kingston, Jamaica (MKJP)" id="raobKingston_Jamaica"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78397"/> <substitute key="stationId" value="78397"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Barbados (MKPB)" id="raobBarbados" menuText="Barbados (MKPB)" id="raobBarbados"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78954"/> <substitute key="stationId" value="78954"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Trinidad (MKPP)" id="raobTrinidad" menuText="Trinidad (MKPP)" id="raobTrinidad"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78970"/> <substitute key="stationId" value="78970"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Howard AFB, PM (MPHO)" id="raobHowardAFB_PM " menuText="Howard AFB, PM (MPHO)" id="raobHowardAFB_PM "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78806"/> <substitute key="stationId" value="78806"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guantanamo Bay, CU (MUGM)" id="raobPortland_ME" menuText="Guantanamo Bay, CU (MUGM)" id="raobPortland_ME"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78367"/> <substitute key="stationId" value="78367"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nassau (MYNN)" id="raobNassau" menuText="Nassau (MYNN)" id="raobNassau"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78073"/> <substitute key="stationId" value="78073"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Belize City, Belize (MZBZ)" id="raobJBelizeCity_Belize" menuText="Belize City, Belize (MZBZ)" id="raobJBelizeCity_Belize"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78583"/> <substitute key="stationId" value="78583"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Riohacha, Colombia (SKRH)" id="raobRiohacha_Colombia" menuText="Riohacha, Colombia (SKRH)" id="raobRiohacha_Colombia"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="80035"/> <substitute key="stationId" value="80035"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cayenne, French Guiana (SOCA)" id="raobCayenne_FrenchGuiana" menuText="Cayenne, French Guiana (SOCA)" id="raobCayenne_FrenchGuiana"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="81405"/> <substitute key="stationId" value="81405"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Le Ralset, Guadeloupe (TFFR)" id="LeRalset_Guadeloupe" menuText="Le Ralset, Guadeloupe (TFFR)" id="LeRalset_Guadeloupe"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78897"/> <substitute key="stationId" value="78897"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="San Juan, PR (TJSJ)" id="raobWashington_DC" menuText="San Juan, PR (TJSJ)" id="raobWashington_DC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78526"/> <substitute key="stationId" value="78526"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Bermuda (TXKF)" id="raobBermuda" menuText="Bermuda (TXKF)" id="raobBermuda"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="78016"/> <substitute key="stationId" value="78016"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,147 +21,147 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Willis Island (94299)" id="raobWillis Island" menuText="Willis Island (94299)" id="raobWillis Island"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94299"/> <substitute key="stationId" value="94299"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cloncurry (94335)" id="raobCloncurry" menuText="Cloncurry (94335)" id="raobCloncurry"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94335"/> <substitute key="stationId" value="94335"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Giles (94461)" id="raobGiles" menuText="Giles (94461)" id="raobGiles"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94461"/> <substitute key="stationId" value="94461"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Moree (94527)" id="raobMoree" menuText="Moree (94527)" id="raobMoree"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94527"/> <substitute key="stationId" value="94527"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Esperance M.O. (94638)" id="raobEsperanceMO" menuText="Esperance M.O. (94638)" id="raobEsperanceMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94638"/> <substitute key="stationId" value="94638"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cobar M.O. (94711)" id="raobCobarMO" menuText="Cobar M.O. (94711)" id="raobCobarMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94711"/> <substitute key="stationId" value="94711"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Halls Creek (AHHC)" id="raobHallsCreek" menuText="Halls Creek (AHHC)" id="raobHallsCreek"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94212"/> <substitute key="stationId" value="94212"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Alice Springs (YBAS)" id="raobAliceSprings" menuText="Alice Springs (YBAS)" id="raobAliceSprings"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94326"/> <substitute key="stationId" value="94326"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Brisbane Airport (YBBN)" id="raobBrisbaneAirport" menuText="Brisbane Airport (YBBN)" id="raobBrisbaneAirport"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94578"/> <substitute key="stationId" value="94578"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cairns M.O. (YBCS)" id="raobCalmsMO" menuText="Cairns M.O. (YBCS)" id="raobCalmsMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94287"/> <substitute key="stationId" value="94287"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Charleville (YBCV)" id="raobCharleville" menuText="Charleville (YBCV)" id="raobCharleville"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94510"/> <substitute key="stationId" value="94510"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Gladstone (YBGL)" id="raobGladstone" menuText="Gladstone (YBGL)" id="raobGladstone"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94380"/> <substitute key="stationId" value="94380"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Longreach M.O. (YBLR)" id="raobLongreachMO" menuText="Longreach M.O. (YBLR)" id="raobLongreachMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94346"/> <substitute key="stationId" value="94346"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mt. Isa Arpt (YBMA)" id="raobMtIsaArpt" menuText="Mt. Isa Arpt (YBMA)" id="raobMtIsaArpt"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94332"/> <substitute key="stationId" value="94332"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mackay M.O. (YBMK)" id="raobMackayMO" menuText="Mackay M.O. (YBMK)" id="raobMackayMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94367"/> <substitute key="stationId" value="94367"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Townsville (YBTL)" id="raobTownsville" menuText="Townsville (YBTL)" id="raobTownsville"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94294"/> <substitute key="stationId" value="94294"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tennant Creek (YDTC)" id="raobTennantCreek" menuText="Tennant Creek (YDTC)" id="raobTennantCreek"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94238"/> <substitute key="stationId" value="94238"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mildura (YMMI)" id="raobMildura" menuText="Mildura (YMMI)" id="raobMildura"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94693"/> <substitute key="stationId" value="94693"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Adelaide Arpt. (YPAD)" id="raobAdelaideArpt" menuText="Adelaide Arpt. (YPAD)" id="raobAdelaideArpt"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94672"/> <substitute key="stationId" value="94672"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Broome M.O. (YPBR)" id="raobBroomeMO" menuText="Broome M.O. (YPBR)" id="raobBroomeMO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94203"/> <substitute key="stationId" value="94203"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ceduna (YPCD)" id="raobCeduna" menuText="Ceduna (YPCD)" id="raobCeduna"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94653"/> <substitute key="stationId" value="94653"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Darwin Airport (YPDN)" id="raobDarwinAirport" menuText="Darwin Airport (YPDN)" id="raobDarwinAirport"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94120"/> <substitute key="stationId" value="94120"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Forrest (YPFT)" id="raobForrest" menuText="Forrest (YPFT)" id="raobForrest"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94646"/> <substitute key="stationId" value="94646"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kalgoorlie (YPKG)" id="raobKalgoorlie" menuText="Kalgoorlie (YPKG)" id="raobKalgoorlie"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94637"/> <substitute key="stationId" value="94637"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Woomera (YPWR)" id="raobWoomera" menuText="Woomera (YPWR)" id="raobWoomera"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94659"/> <substitute key="stationId" value="94659"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Coffs Harbour Arpt (YSCH)" id="raobCoffsHarbourArpt" menuText="Coffs Harbour Arpt (YSCH)" id="raobCoffsHarbourArpt"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94791"/> <substitute key="stationId" value="94791"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nowra (YSNW)" id="raobNowra" menuText="Nowra (YSNW)" id="raobNowra"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94750"/> <substitute key="stationId" value="94750"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sydney Arpt (YSSY)" id="raobSydney Arpt" menuText="Sydney Arpt (YSSY)" id="raobSydney Arpt"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94767"/> <substitute key="stationId" value="94767"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Williamtown Aerodrome (YSWM)" id="raobWilliamtownAerodrome" menuText="Williamtown Aerodrome (YSWM)" id="raobWilliamtownAerodrome"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94776"/> <substitute key="stationId" value="94776"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,22 +21,22 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Camp Shilo, MB (CWLO)" id="raobCampShilo_MB" menuText="Camp Shilo, MB (CWLO)" id="raobCampShilo_MB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71853"/> <substitute key="stationId" value="71853"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pickle Lake, ON (CWPL)" id="raobPickleLake_ON" menuText="Pickle Lake, ON (CWPL)" id="raobPickleLake_ON"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71845"/> <substitute key="stationId" value="71845"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="The Pas, MB (CYQD)" id="raobThePas_MB" menuText="The Pas, MB (CYQD)" id="raobThePas_MB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71867"/> <substitute key="stationId" value="71867"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Churchill, MB (CYYQ)" id="raobChurchill_MB" menuText="Churchill, MB (CYYQ)" id="raobChurchill_MB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71913"/> <substitute key="stationId" value="71913"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,87 +21,87 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Placentia, NF (CWAR)" id="raobPlacentia_NF" menuText="Placentia, NF (CWAR)" id="raobPlacentia_NF"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71807"/> <substitute key="stationId" value="71807"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Maniwaki, QB (CWMW)" id="raobManiwaki_QB" menuText="Maniwaki, QB (CWMW)" id="raobManiwaki_QB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71722"/> <substitute key="stationId" value="71722"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shelburne, NS (CWOS)" id="raobShelburne_NS" menuText="Shelburne, NS (CWOS)" id="raobShelburne_NS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71399"/> <substitute key="stationId" value="71399"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sable Island, NS (CWSA)" id="raobSableIsland_NS" menuText="Sable Island, NS (CWSA)" id="raobSableIsland_NS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71600"/> <substitute key="stationId" value="71600"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Moosonee, ON (CWZC)" id="raobMoosonee_ON" menuText="Moosonee, ON (CWZC)" id="raobMoosonee_ON"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71836"/> <substitute key="stationId" value="71836"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="La Grande 4, QB (CYAH)" id="raobLaGrande4_QB" menuText="La Grande 4, QB (CYAH)" id="raobLaGrande4_QB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71823"/> <substitute key="stationId" value="71823"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Camp Gagetown NB (CYCX)" id="raobCampGagetown_NB" menuText="Camp Gagetown NB (CYCX)" id="raobCampGagetown_NB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71701"/> <substitute key="stationId" value="71701"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Halifax Metoc, NS (CYHZ)" id="raobHalifaxMetoc_NS" menuText="Halifax Metoc, NS (CYHZ)" id="raobHalifaxMetoc_NS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71396"/> <substitute key="stationId" value="71396"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Stephenville, NF (CYJT)" id="raobStephenville_NF" menuText="Stephenville, NF (CYJT)" id="raobStephenville_NF"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71815"/> <substitute key="stationId" value="71815"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Inoucdjouac, QC (CYPH)" id="raobInoucdjouac_QC" menuText="Inoucdjouac, QC (CYPH)" id="raobInoucdjouac_QC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71907"/> <substitute key="stationId" value="71907"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yarmouth, NS (CYQI)" id="raobAtlanta_GA" menuText="Yarmouth, NS (CYQI)" id="raobAtlanta_GA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71603"/> <substitute key="stationId" value="71603"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Montreal/Dorval, QB (CYUL)" id="raobDorval_QB" menuText="Montreal/Dorval, QB (CYUL)" id="raobDorval_QB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71627"/> <substitute key="stationId" value="71627"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fort Chimo, QB (CYVP)" id="raobFortChimo_QB" menuText="Fort Chimo, QB (CYVP)" id="raobFortChimo_QB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71906"/> <substitute key="stationId" value="71906"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Goose Bay, NF (CYYR)" id="raobGooseBay_NF" menuText="Goose Bay, NF (CYYR)" id="raobGooseBay_NF"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71816"/> <substitute key="stationId" value="71816"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="St. Johns/Torbay, NF (CYYT)" id="raobTorbay_NF" menuText="St. Johns/Torbay, NF (CYYT)" id="raobTorbay_NF"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71801"/> <substitute key="stationId" value="71801"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Toronto Int'l, ON (CYYZ)" id="raobTorontoIntl_ON " menuText="Toronto Int'l, ON (CYYZ)" id="raobTorontoIntl_ON "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71624"/> <substitute key="stationId" value="71624"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sept-lies, QB (CYZV)" id="raobSept-lies_QB" menuText="Sept-lies, QB (CYZV)" id="raobSept-lies_QB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71811"/> <substitute key="stationId" value="71811"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,67 +21,67 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Eueka, NW (CWEU)" id="raobEueka_NW" menuText="Eueka, NW (CWEU)" id="raobEueka_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71917"/> <substitute key="stationId" value="71917"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sachs Harbour, NW (CWSY)" id="raobSachsHarbour_NW" menuText="Sachs Harbour, NW (CWSY)" id="raobSachsHarbour_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71051"/> <substitute key="stationId" value="71051"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Baker Lake, NW (CYBK)" id="raobBakerLake_NW" menuText="Baker Lake, NW (CYBK)" id="raobBakerLake_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71926"/> <substitute key="stationId" value="71926"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cambridge Bay, NW (CYCB)" id="raobCambridgeBay_NW" menuText="Cambridge Bay, NW (CYCB)" id="raobCambridgeBay_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71925"/> <substitute key="stationId" value="71925"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Inuvik, NW (CYEV)" id="raobInuvik_NW" menuText="Inuvik, NW (CYEV)" id="raobInuvik_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71957"/> <substitute key="stationId" value="71957"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Frobisher Bay, NW (CYFB)" id="raobFrobisherBay_NW" menuText="Frobisher Bay, NW (CYFB)" id="raobFrobisherBay_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71909"/> <substitute key="stationId" value="71909"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Alert, NW (CYLT)" id="raobAlert_NW" menuText="Alert, NW (CYLT)" id="raobAlert_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71082"/> <substitute key="stationId" value="71082"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Resolute Bay, NW (CYRB)" id="raobResoluteBay_NW" menuText="Resolute Bay, NW (CYRB)" id="raobResoluteBay_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71924"/> <substitute key="stationId" value="71924"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fort Smith, NW (CYSM)" id="FortSmith_NW" menuText="Fort Smith, NW (CYSM)" id="FortSmith_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71934"/> <substitute key="stationId" value="71934"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Hall Beach, NW (CYUX)" id="raobHallBeach_NW" menuText="Hall Beach, NW (CYUX)" id="raobHallBeach_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71081"/> <substitute key="stationId" value="71081"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nonman Wells, NW (CYVQ)" id="raobNonmanWells_NW" menuText="Nonman Wells, NW (CYVQ)" id="raobNonmanWells_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71043"/> <substitute key="stationId" value="71043"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Whitehorse, YK (CYXY)" id="raobWhitehorse_YK" menuText="Whitehorse, YK (CYXY)" id="raobWhitehorse_YK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71964"/> <substitute key="stationId" value="71964"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Coral Harbour, NW (CYZS)" id="raobCoralHarbour_NW" menuText="Coral Harbour, NW (CYZS)" id="raobCoralHarbour_NW"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71915"/> <substitute key="stationId" value="71915"/>
</contribute> </contribute>

View file

@ -21,52 +21,52 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Edmonton/Stony, AB (CWEG)" id="raobStony_AB" menuText="Edmonton/Stony, AB (CWEG)" id="raobStony_AB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71119"/> <substitute key="stationId" value="71119"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Edmonton/Namao, AB (CYED)" id="raobNamao_AB" menuText="Edmonton/Namao, AB (CYED)" id="raobNamao_AB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71121"/> <substitute key="stationId" value="71121"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Edmonton Airport, AB (CYEG)" id="raobEdmontonAirport_AB" menuText="Edmonton Airport, AB (CYEG)" id="raobEdmontonAirport_AB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71123"/> <substitute key="stationId" value="71123"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kelowna, BC (CYLW)" id="raobKelowna_BC" menuText="Kelowna, BC (CYLW)" id="raobKelowna_BC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71203"/> <substitute key="stationId" value="71203"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cold Lake, AB (CYOD)" id="raobColdLake_AB" menuText="Cold Lake, AB (CYOD)" id="raobColdLake_AB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71120"/> <substitute key="stationId" value="71120"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Edmonton, AB (CYXD)" id="raobEdmonton_AB" menuText="Edmonton, AB (CYXD)" id="raobEdmonton_AB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71879"/> <substitute key="stationId" value="71879"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Prince George, BC (CYXS)" id="raobPrinceGeorge_BC" menuText="Prince George, BC (CYXS)" id="raobPrinceGeorge_BC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71896"/> <substitute key="stationId" value="71896"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fort Nelson, BC (CYYE)" id="raobFortNelson_BC" menuText="Fort Nelson, BC (CYYE)" id="raobFortNelson_BC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71945"/> <substitute key="stationId" value="71945"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Victoria, BC (CYYJ)" id="raobVictoria_BC" menuText="Victoria, BC (CYYJ)" id="raobVictoria_BC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71799"/> <substitute key="stationId" value="71799"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Port Hardy, BC (CYZT)" id="raobPortHardy_BC" menuText="Port Hardy, BC (CYZT)" id="raobPortHardy_BC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="71109"/> <substitute key="stationId" value="71109"/>
</contribute> </contribute>

View file

@ -21,92 +21,92 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nenjiang (50557)" id="raobNenjiang" menuText="Nenjiang (50557)" id="raobNenjiang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="50557"/> <substitute key="stationId" value="50557"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yichun (50774)" id="raobYichun" menuText="Yichun (50774)" id="raobYichun"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="50774"/> <substitute key="stationId" value="50774"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mudanjiang (54094)" id="raobMudanjiang" menuText="Mudanjiang (54094)" id="raobMudanjiang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54094"/> <substitute key="stationId" value="54094"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tongliao (54135)" id="raobTongliao" menuText="Tongliao (54135)" id="raobTongliao"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54135"/> <substitute key="stationId" value="54135"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yanji (54292)" id="raobYanji" menuText="Yanji (54292)" id="raobYanji"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54292"/> <substitute key="stationId" value="54292"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Jinzhou (54337)" id="raobJinzhou" menuText="Jinzhou (54337)" id="raobJinzhou"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54337"/> <substitute key="stationId" value="54337"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dandong (54497)" id="raobDandong" menuText="Dandong (54497)" id="raobDandong"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54497"/> <substitute key="stationId" value="54497"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Chengshantou (54776)" id="raobChengshantou" menuText="Chengshantou (54776)" id="raobChengshantou"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54776"/> <substitute key="stationId" value="54776"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sheyang (58150)" id="raobSheyang" menuText="Sheyang (58150)" id="raobSheyang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="58150"/> <substitute key="stationId" value="58150"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dachen Island (58666)" id="raobDachenIsland" menuText="Dachen Island (58666)" id="raobDachenIsland"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="58666"/> <substitute key="stationId" value="58666"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Hangchou (ZSHC)" id="raobHangchou" menuText="Hangchou (ZSHC)" id="raobHangchou"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="58457"/> <substitute key="stationId" value="58457"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Qingdao (ZSQD)" id="raobQingdao" menuText="Qingdao (ZSQD)" id="raobQingdao"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54857"/> <substitute key="stationId" value="54857"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shanghai (ZSSS)" id="raobShanghai" menuText="Shanghai (ZSSS)" id="raobShanghai"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="58362"/> <substitute key="stationId" value="58362"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Changchun (ZYCC)" id="raobChangchun" menuText="Changchun (ZYCC)" id="raobChangchun"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54161"/> <substitute key="stationId" value="54161"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Harbin (ZYHB)" id="raobHarbin" menuText="Harbin (ZYHB)" id="raobHarbin"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="50953"/> <substitute key="stationId" value="50953"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Qiqihar (ZYQQ)" id="raobQiqihar" menuText="Qiqihar (ZYQQ)" id="raobQiqihar"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="50745"/> <substitute key="stationId" value="50745"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dalian (ZYTL)" id="raobDalian" menuText="Dalian (ZYTL)" id="raobDalian"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54662"/> <substitute key="stationId" value="54662"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shenyang (ZYYY)" id="raobShenyang" menuText="Shenyang (ZYYY)" id="raobShenyang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54342"/> <substitute key="stationId" value="54342"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,161 +21,161 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Wajima (47600)" id="raobWajima" menuText="Wajima (47600)" id="raobWajima"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47600"/> <substitute key="stationId" value="47600"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tateno (47646)" id="raobTateno" menuText="Tateno (47646)" id="raobTateno"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47646"/> <substitute key="stationId" value="47646"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shionomisaki (47776)" id="raobShionomisaki" menuText="Shionomisaki (47776)" id="raobShionomisaki"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47776"/> <substitute key="stationId" value="47776"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fukuoka (47807)" id="raobFukuoka" menuText="Fukuoka (47807)" id="raobFukuoka"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47807"/> <substitute key="stationId" value="47807"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Linjiang (54374)" id="raobLinjiang" menuText="Linjiang (54374)" id="raobLinjiang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="54374"/> <substitute key="stationId" value="54374"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ship C7T/Tango (99025)" id="raobTango" menuText="Ship C7T/Tango (99025)" id="raobTango"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="99025"/> <substitute key="stationId" value="99025"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Diego Garcia Is. (DJDG)" id="raobDiegoGarciaIs" menuText="Diego Garcia Is. (DJDG)" id="raobDiegoGarciaIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="61967"/> <substitute key="stationId" value="61967"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Taoyuan (RCGM)" id="raobTaoyuan" menuText="Taoyuan (RCGM)" id="raobTaoyuan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="46697"/> <substitute key="stationId" value="46697"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tungchiang (RCMJ)" id="raobTungchiang" menuText="Tungchiang (RCMJ)" id="raobTungchiang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="595530"/> <substitute key="stationId" value="595530"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Taipei (RCSS)" id="raobTaipei" menuText="Taipei (RCSS)" id="raobTaipei"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="589680"/> <substitute key="stationId" value="589680"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Chichi Jima (RJAO)" id="raobChichijima" menuText="Chichi Jima (RJAO)" id="raobChichijima"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47971"/> <substitute key="stationId" value="47971"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Iwo Jima (RJAW)" id="raobIwoJima" menuText="Iwo Jima (RJAW)" id="raobIwoJima"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47981"/> <substitute key="stationId" value="47981"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sapporo (RJCO)" id="raobSapporo" menuText="Sapporo (RJCO)" id="raobSapporo"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47412"/> <substitute key="stationId" value="47412"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fukuoka/Itazuke AB (RJFF)" id="raobItazukeAB" menuText="Fukuoka/Itazuke AB (RJFF)" id="raobItazukeAB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47807"/> <substitute key="stationId" value="47807"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kagoshima/Yoshino (RJFK)" id="raobYoshino" menuText="Kagoshima/Yoshino (RJFK)" id="raobYoshino"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47827"/> <substitute key="stationId" value="47827"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Hamamatsu AB (RJNH)" id="raobHamamatsuAB" menuText="Hamamatsu AB (RJNH)" id="raobHamamatsuAB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47681"/> <substitute key="stationId" value="47681"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tokushima AB (RJOS)" id="raobTokushimaAB" menuText="Tokushima AB (RJOS)" id="raobTokushimaAB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47881"/> <substitute key="stationId" value="47881"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Akita (RJSK)" id="raobAkita" menuText="Akita (RJSK)" id="raobAkita"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47582"/> <substitute key="stationId" value="47582"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Misawa (RJSM)" id="raobMisawa" menuText="Misawa (RJSM)" id="raobMisawa"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47580"/> <substitute key="stationId" value="47580"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sendai (RJSS)" id="raobMiami_FL" menuText="Sendai (RJSS)" id="raobMiami_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47590"/> <substitute key="stationId" value="47590"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kwangju (KOR-AFB) (RKJJ)" id="raobKwangju" menuText="Kwangju (KOR-AFB) (RKJJ)" id="raobKwangju"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47158"/> <substitute key="stationId" value="47158"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cheju Do/Mosulpo (RKPM)" id="raobMosulpo" menuText="Cheju Do/Mosulpo (RKPM)" id="raobMosulpo"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47185"/> <substitute key="stationId" value="47185"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Osan (RKSO)" id="raobOsan" menuText="Osan (RKSO)" id="raobOsan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47122"/> <substitute key="stationId" value="47122"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Seoul/Kimpo Intl. (RKSS)" id="raobKimpoIntl" menuText="Seoul/Kimpo Intl. (RKSS)" id="raobKimpoIntl"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47110"/> <substitute key="stationId" value="47110"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pohang (RKTH)" id="raobPohang" menuText="Pohang (RKTH)" id="raobPohang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47138"/> <substitute key="stationId" value="47138"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Naha/Kagamizu (ROAH)" id="raobKagamizu" menuText="Naha/Kagamizu (ROAH)" id="raobKagamizu"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47936"/> <substitute key="stationId" value="47936"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kadena AB (RODN)" id="raobKadenaAB" menuText="Kadena AB (RODN)" id="raobKadenaAB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47931"/> <substitute key="stationId" value="47931"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ishigaki Jima (ROIG)" id="raobIshigakijima " menuText="Ishigaki Jima (ROIG)" id="raobIshigakijima "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47918"/> <substitute key="stationId" value="47918"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Minamidaito Jima (ROMD)" id="raobMinamidaltojima" menuText="Minamidaito Jima (ROMD)" id="raobMinamidaltojima"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47945"/> <substitute key="stationId" value="47945"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Clark AFB (RPMK)" id="raobClearkAFB" menuText="Clark AFB (RPMK)" id="raobClearkAFB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="98327"/> <substitute key="stationId" value="98327"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pyongyang (ZKKK)" id="raobPyongyang" menuText="Pyongyang (ZKKK)" id="raobPyongyang"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47058"/> <substitute key="stationId" value="47058"/>
</contribute> </contribute>

View file

@ -21,138 +21,138 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Acapulco, MX (MACA)" id="raobAcapulco_MX" menuText="Acapulco, MX (MACA)" id="raobAcapulco_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76805"/> <substitute key="stationId" value="76805"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Arriaga, MX (MARR)" id="raobArriaga_MX" menuText="Arriaga, MX (MARR)" id="raobArriaga_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76840"/> <substitute key="stationId" value="76840"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ciudad Del Carmen, MX (MCME)" id="raobCiudadDelCarmen_MX " menuText="Ciudad Del Carmen, MX (MCME)" id="raobCiudadDelCarmen_MX "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76749"/> <substitute key="stationId" value="76749"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ciudad Victoria, MX (MCVM)" id="raobCiudadVictoria_MX " menuText="Ciudad Victoria, MX (MCVM)" id="raobCiudadVictoria_MX "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76225"/> <substitute key="stationId" value="76225"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cozumel_2, MX (MCZM)" id="raobCozumel2_MX" menuText="Cozumel_2, MX (MCZM)" id="raobCozumel2_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76649"/> <substitute key="stationId" value="76649"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Isle of Guadalupe, MX (MILS)" id="raobIsleofGuadalupe_MX " menuText="Isle of Guadalupe, MX (MILS)" id="raobIsleofGuadalupe_MX "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76151"/> <substitute key="stationId" value="76151"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Socorro Island, MX (MISC)" id="raobSocorroIsland_MX" menuText="Socorro Island, MX (MISC)" id="raobSocorroIsland_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76723"/> <substitute key="stationId" value="76723"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ixtepec, MX (MIZT)" id="raobIxtepec_MX" menuText="Ixtepec, MX (MIZT)" id="raobIxtepec_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76830"/> <substitute key="stationId" value="76830"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="La Paz, MX (MLAP)" id="raobLaPaz_MX" menuText="La Paz, MX (MLAP)" id="raobLaPaz_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76405"/> <substitute key="stationId" value="76405"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Los Mochis, MX (MLMM)" id="raobLosMochis_MX" menuText="Los Mochis, MX (MLMM)" id="raobLosMochis_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76361"/> <substitute key="stationId" value="76361"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Chihuahua, MX (MMCU)" id="raobChihuahua_MX " menuText="Chihuahua, MX (MMCU)" id="raobChihuahua_MX "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76225"/> <substitute key="stationId" value="76225"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mexico/Central, MX (MMDF)" id="raobCentral, MX" menuText="Mexico/Central, MX (MMDF)" id="raobCentral, MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76679"/> <substitute key="stationId" value="76679"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guadalajara, MX (MMGL)" id="raobGuadalajara_MX" menuText="Guadalajara, MX (MMGL)" id="raobGuadalajara_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72226"/> <substitute key="stationId" value="72226"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guaymas (MMGM)" id="raobGuaymas" menuText="Guaymas (MMGM)" id="raobGuaymas"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76256"/> <substitute key="stationId" value="76256"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Merida, MX (MMMD)" id="raobMerida_MX" menuText="Merida, MX (MMMD)" id="raobMerida_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76644"/> <substitute key="stationId" value="76644"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cancun, MX (MMUN)" id="raobCancun_MX" menuText="Cancun, MX (MMUN)" id="raobCancun_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76595"/> <substitute key="stationId" value="76595"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mexico City, MX (MMMX)" id="raobMexicoCity_MX" menuText="Mexico City, MX (MMMX)" id="raobMexicoCity_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76679"/> <substitute key="stationId" value="76679"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Monterrey, MX (MMMY)" id="raobMonterrey_MX" menuText="Monterrey, MX (MMMY)" id="raobMonterrey_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76394"/> <substitute key="stationId" value="76394"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mazatlan, MX (MMMZ)" id="raobMazatian_MX" menuText="Mazatlan, MX (MMMZ)" id="raobMazatian_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76458"/> <substitute key="stationId" value="76458"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Morelia, MX (MMOR)" id="raobMorelia_MX" menuText="Morelia, MX (MMOR)" id="raobMorelia_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76665"/> <substitute key="stationId" value="76665"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Monclova, MX (MMOV)" id="raobMonclova_MX" menuText="Monclova, MX (MMOV)" id="raobMonclova_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76342"/> <substitute key="stationId" value="76342"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Veracruz, MX (MMVR)" id="raobVeracruz_MX" menuText="Veracruz, MX (MMVR)" id="raobVeracruz_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76692"/> <substitute key="stationId" value="76692"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Manzanillo, MX (MMZO)" id="raobManzanillo_MX" menuText="Manzanillo, MX (MMZO)" id="raobManzanillo_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76654"/> <substitute key="stationId" value="76654"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Soto La Marina, MX (MSOT)" id="raobSotoLaMarina_MX" menuText="Soto La Marina, MX (MSOT)" id="raobSotoLaMarina_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76499"/> <substitute key="stationId" value="76499"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tampico, MX (MTAM)" id="raobTampico_MX" menuText="Tampico, MX (MTAM)" id="raobTampico_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76548"/> <substitute key="stationId" value="76548"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tapachula, MX (MTAP)" id="raobTapachula_MX" menuText="Tapachula, MX (MTAP)" id="raobTapachula_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76904"/> <substitute key="stationId" value="76904"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Torreon, MX (MTRC)" id="raobTorreon_MX" menuText="Torreon, MX (MTRC)" id="raobTorreon_MX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="76382"/> <substitute key="stationId" value="76382"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,68 +21,68 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Rikitea (91948)" id="raobRikitea" menuText="Rikitea (91948)" id="raobRikitea"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91948"/> <substitute key="stationId" value="91948"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Rapa (91958)" id="raobRapa" menuText="Rapa (91958)" id="raobRapa"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91958"/> <substitute key="stationId" value="91958"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Rarotonga (NCRG)" id="raobRarotonga" menuText="Rarotonga (NCRG)" id="raobRarotonga"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91843"/> <substitute key="stationId" value="91843"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pago Pago, American Samoa (NSTU)" id="raobAmericanSamoa" menuText="Pago Pago, American Samoa (NSTU)" id="raobAmericanSamoa"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91765"/> <substitute key="stationId" value="91765"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Atuona (NTMN)" id="raobAtuona" menuText="Atuona (NTMN)" id="raobAtuona"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91925"/> <substitute key="stationId" value="91925"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Hao (NTTO)" id="raobHao" menuText="Hao (NTTO)" id="raobHao"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91944"/> <substitute key="stationId" value="91944"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Papeete/Tahiti (NTTT)" id="raobTahiti" menuText="Papeete/Tahiti (NTTT)" id="raobTahiti"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91938"/> <substitute key="stationId" value="91938"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Raoul Is/Kermadec (NZRN)" id="raobKermadec" menuText="Raoul Is/Kermadec (NZRN)" id="raobKermadec"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="93997"/> <substitute key="stationId" value="93997"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Canton Is (Jopham Arpt) (PCIS)" id="raobCantonIs" menuText="Canton Is (Jopham Arpt) (PCIS)" id="raobCantonIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91700"/> <substitute key="stationId" value="91700"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Lihue, HI (PHLI)" id="raobLihue_HI" menuText="Lihue, HI (PHLI)" id="raobLihue_HI"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91165"/> <substitute key="stationId" value="91165"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Hilo, HI (PHTO)" id="raobHilo_HI " menuText="Hilo, HI (PHTO)" id="raobHilo_HI "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91285"/> <substitute key="stationId" value="91285"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Johnston Is. (USWB) (PJON)" id="raobJohnstonIs" menuText="Johnston Is. (USWB) (PJON)" id="raobJohnstonIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91275"/> <substitute key="stationId" value="91275"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Midway Island (Nayv) (PMDY)" id="raobPortland_ME" menuText="Midway Island (Nayv) (PMDY)" id="raobPortland_ME"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91066"/> <substitute key="stationId" value="91066"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,120 +21,120 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pacific V (99027)" id="raobPacificV" menuText="Pacific V (99027)" id="raobPacificV"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="99027"/> <substitute key="stationId" value="99027"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Honiara (AGGH)" id="raobHonlara" menuText="Honiara (AGGH)" id="raobHonlara"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91520"/> <substitute key="stationId" value="91520"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Lord Howe Island (ASLH)" id="raobLordHoweIsland" menuText="Lord Howe Island (ASLH)" id="raobLordHoweIsland"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94995"/> <substitute key="stationId" value="94995"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Lae (AYLA)" id="raobLae" menuText="Lae (AYLA)" id="raobLae"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94027"/> <substitute key="stationId" value="94027"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Port Moresby (AYPY)" id="raobPortMoresby" menuText="Port Moresby (AYPY)" id="raobPortMoresby"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="92035"/> <substitute key="stationId" value="92035"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nandi (NFFN)" id="raobNandi" menuText="Nandi (NFFN)" id="raobNandi"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91680"/> <substitute key="stationId" value="91680"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Funafuti (NGFU)" id="raobFunafuti" menuText="Funafuti (NGFU)" id="raobFunafuti"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91643"/> <substitute key="stationId" value="91643"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tarawa (NGTA)" id="raobTarawa" menuText="Tarawa (NGTA)" id="raobTarawa"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91610"/> <substitute key="stationId" value="91610"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Vila (Efate) (NHHH)" id="raobVila" menuText="Vila (Efate) (NHHH)" id="raobVila"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91557"/> <substitute key="stationId" value="91557"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Noumea (NWWN)" id="raobNoumea" menuText="Noumea (NWWN)" id="raobNoumea"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91592"/> <substitute key="stationId" value="91592"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guam/Taguac, GU (PGAC)" id="raobTaguac_GU " menuText="Guam/Taguac, GU (PGAC)" id="raobTaguac_GU "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91217"/> <substitute key="stationId" value="91217"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guam/Anderson AFB, GU (PGUA)" id="raobAndersonAFB_GU " menuText="Guam/Anderson AFB, GU (PGUA)" id="raobAndersonAFB_GU "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91218"/> <substitute key="stationId" value="91218"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Guam, GU (PGUM)" id="raobGuam_GU" menuText="Guam, GU (PGUM)" id="raobGuam_GU"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91212"/> <substitute key="stationId" value="91212"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Eniwetok (PKMA)" id="raobEniwetok" menuText="Eniwetok (PKMA)" id="raobEniwetok"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91250"/> <substitute key="stationId" value="91250"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Kwajalein Atoll (PKWA)" id="raobKwajaleinAtoll" menuText="Kwajalein Atoll (PKWA)" id="raobKwajaleinAtoll"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91366"/> <substitute key="stationId" value="91366"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Majuro, Marshall Islands (PMKJ)" id="raobMajuro_MarshallIslands" menuText="Majuro, Marshall Islands (PMKJ)" id="raobMajuro_MarshallIslands"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91376"/> <substitute key="stationId" value="91376"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Chuuk, East Caroline Is (PTKK)" id="raobChuuk_EastCarolineIs" menuText="Chuuk, East Caroline Is (PTKK)" id="raobChuuk_EastCarolineIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91334"/> <substitute key="stationId" value="91334"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ponape, East Caroline Is (PTPN)" id="raobPonape_EastCarolineIs" menuText="Ponape, East Caroline Is (PTPN)" id="raobPonape_EastCarolineIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91348"/> <substitute key="stationId" value="91348"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Koror, Palau Islands (PTRO)" id="raobKoror_PalauIslands" menuText="Koror, Palau Islands (PTRO)" id="raobKoror_PalauIslands"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91408"/> <substitute key="stationId" value="91408"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yap, West Caroline Is (PTYA)" id="raobYap_WestCarolineIs" menuText="Yap, West Caroline Is (PTYA)" id="raobYap_WestCarolineIs"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91413"/> <substitute key="stationId" value="91413"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Wake Island (PWAK)" id="raobWake Island" menuText="Wake Island (PWAK)" id="raobWake Island"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="91245"/> <substitute key="stationId" value="91245"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Minamitorishima (RJAM)" id="raobMinamitorishima" menuText="Minamitorishima (RJAM)" id="raobMinamitorishima"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="47991"/> <substitute key="stationId" value="47991"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Norfolk Island Arpt (YSNF)" id="raobNorfolkIslandArpt" menuText="Norfolk Island Arpt (YSNF)" id="raobNorfolkIslandArpt"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="94996"/> <substitute key="stationId" value="94996"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,147 +21,147 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Mys Uzlen (25399)" id="raobMys Uzlen" menuText="Mys Uzlen (25399)" id="raobMys Uzlen"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="25399"/> <substitute key="stationId" value="25399"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Aldan (31004)" id="raobAldan" menuText="Aldan (31004)" id="raobAldan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31004"/> <substitute key="stationId" value="31004"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Okhotsk (31088)" id="raobOkhotsk" menuText="Okhotsk (31088)" id="raobOkhotsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31088"/> <substitute key="stationId" value="31088"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ayan (31168)" id="raobAyan" menuText="Ayan (31168)" id="raobAyan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31168"/> <substitute key="stationId" value="31168"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nikolayevsk-n Amur (31369)" id="raobNikolayevsk-nAmur" menuText="Nikolayevsk-n Amur (31369)" id="raobNikolayevsk-nAmur"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31369"/> <substitute key="stationId" value="31369"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Blagoveshchensk (31510)" id="raobBlagoveshchensk" menuText="Blagoveshchensk (31510)" id="raobBlagoveshchensk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31510"/> <substitute key="stationId" value="31510"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sutur (31538)" id="raobSutur" menuText="Sutur (31538)" id="raobSutur"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31538"/> <substitute key="stationId" value="31538"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Komsomol'sk (31561)" id="raobKomsomol'sk" menuText="Komsomol'sk (31561)" id="raobKomsomol'sk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31561"/> <substitute key="stationId" value="31561"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yekaterino-nikolsk (31707)" id="raobYekaterino-nikolsk" menuText="Yekaterino-nikolsk (31707)" id="raobYekaterino-nikolsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31707"/> <substitute key="stationId" value="31707"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sovetskaya Gavan (31770)" id="raobSovetskayaGavan" menuText="Sovetskaya Gavan (31770)" id="raobSovetskayaGavan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31770"/> <substitute key="stationId" value="31770"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dalnerechensk (31873)" id="raobDalnerechensk" menuText="Dalnerechensk (31873)" id="raobDalnerechensk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31873"/> <substitute key="stationId" value="31873"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ternej (31909)" id="raobTernej" menuText="Ternej (31909)" id="raobTernej"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31909"/> <substitute key="stationId" value="31909"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Aleksandrovsk-Sakh. (32061)" id="raobAleksandrovsk-Sakh" menuText="Aleksandrovsk-Sakh. (32061)" id="raobAleksandrovsk-Sakh"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32061"/> <substitute key="stationId" value="32061"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Poronajsk (32098)" id="raobPoronajsk" menuText="Poronajsk (32098)" id="raobPoronajsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32098"/> <substitute key="stationId" value="32098"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Juzhno-Kurilsk (32165)" id="raobJuzhno-Kurilsk" menuText="Juzhno-Kurilsk (32165)" id="raobJuzhno-Kurilsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32165"/> <substitute key="stationId" value="32165"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Urup (32186)" id="raobUrup" menuText="Urup (32186)" id="raobUrup"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32186"/> <substitute key="stationId" value="32186"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuzhno-Kuril'SK (32217)" id="raobYuzhno-KurilSK" menuText="Yuzhno-Kuril'SK (32217)" id="raobYuzhno-KurilSK"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32217"/> <substitute key="stationId" value="32217"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Klyuchi (32389)" id="raobKlyuchi" menuText="Klyuchi (32389)" id="raobKlyuchi"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32389"/> <substitute key="stationId" value="32389"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Sobolevo (32477)" id="raobSobolevo" menuText="Sobolevo (32477)" id="raobSobolevo"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32477"/> <substitute key="stationId" value="32477"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nikol'skoye (32616)" id="raobNikol'skoye" menuText="Nikol'skoye (32616)" id="raobNikol'skoye"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32616"/> <substitute key="stationId" value="32616"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Khabarovsk (RUHB)" id="raobKhabarovsk" menuText="Khabarovsk (RUHB)" id="raobKhabarovsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31735"/> <substitute key="stationId" value="31735"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuzhno-Sahalinsk (RUSH)" id="raobYuzhno-Sahalinsk" menuText="Yuzhno-Sahalinsk (RUSH)" id="raobYuzhno-Sahalinsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32150"/> <substitute key="stationId" value="32150"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tiksi (RUTS)" id="raobTiksi" menuText="Tiksi (RUTS)" id="raobTiksi"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="21824"/> <substitute key="stationId" value="21824"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Anadyr' (UHMA)" id="raobnadyr'" menuText="Anadyr' (UHMA)" id="raobnadyr'"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="25563"/> <substitute key="stationId" value="25563"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Bukhta Provideniya (UHMD)" id="raobBukhta Provideniya" menuText="Bukhta Provideniya (UHMD)" id="raobBukhta Provideniya"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="25594"/> <substitute key="stationId" value="25594"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Magadan (UHMM)" id="raobMagadan" menuText="Magadan (UHMM)" id="raobMagadan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="25913"/> <substitute key="stationId" value="25913"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Ekimchan (UHPB)" id="raobEkimchan" menuText="Ekimchan (UHPB)" id="raobEkimchan"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31329"/> <substitute key="stationId" value="31329"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Peptropavlovsk (UHPP)" id="raobPeptropavlovsk" menuText="Peptropavlovsk (UHPP)" id="raobPeptropavlovsk"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="32540"/> <substitute key="stationId" value="32540"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Vladivostok (UHWW)" id="raobVladivostok" menuText="Vladivostok (UHWW)" id="raobVladivostok"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="31960"/> <substitute key="stationId" value="31960"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,117 +21,117 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Aberdeen, SD (KABR)" id="raobAberdeen_SD" menuText="Aberdeen, SD (KABR)" id="raobAberdeen_SD"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72659"/> <substitute key="stationId" value="72659"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Amarillo, TX (KAMA)" id="raobAmarillo_TX" menuText="Amarillo, TX (KAMA)" id="raobAmarillo_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72363"/> <substitute key="stationId" value="72363"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Bismarck, ND (KBIS)" id="raobBismarck_ND" menuText="Bismarck, ND (KBIS)" id="raobBismarck_ND"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72764"/> <substitute key="stationId" value="72764"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Brownsville, TX (KBRO)" id="raobBrownsville_TX" menuText="Brownsville, TX (KBRO)" id="raobBrownsville_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72250"/> <substitute key="stationId" value="72250"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Corpus Christi, TX (KCRP)" id="raobCorpusChristi_TX" menuText="Corpus Christi, TX (KCRP)" id="raobCorpusChristi_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72251"/> <substitute key="stationId" value="72251"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Dodge City, KS (KDDC)" id="raobDodgeCity_KS" menuText="Dodge City, KS (KDDC)" id="raobDodgeCity_KS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72451"/> <substitute key="stationId" value="72451"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Del Rio, TX (KDRT)" id="raobDelRio_TX" menuText="Del Rio, TX (KDRT)" id="raobDelRio_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72261"/> <substitute key="stationId" value="72261"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Quad Cities, IL (KDVN)" id="raobQuadCities_IL" menuText="Quad Cities, IL (KDVN)" id="raobQuadCities_IL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74455"/> <substitute key="stationId" value="74455"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="El Paso, TX (KEPZ)" id="raobElPaso_TX" menuText="El Paso, TX (KEPZ)" id="raobElPaso_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72364"/> <substitute key="stationId" value="72364"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fort Worth, TX (KFWD)" id="raobFortWorth_TX " menuText="Fort Worth, TX (KFWD)" id="raobFortWorth_TX "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72249"/> <substitute key="stationId" value="72249"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Green Bay, WI (KGRB)" id="raobGreenBay_WI" menuText="Green Bay, WI (KGRB)" id="raobGreenBay_WI"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72645"/> <substitute key="stationId" value="72645"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Fort Hood, TX (KHLR)" id="raobFortHood_TX" menuText="Fort Hood, TX (KHLR)" id="raobFortHood_TX"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72257"/> <substitute key="stationId" value="72257"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Lincoln, IL (KILX)" id="raobLincoln_IL" menuText="Lincoln, IL (KILX)" id="raobLincoln_IL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74560"/> <substitute key="stationId" value="74560"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="International Falls, MN (KINL)" id="raobInternationalFalls_MN" menuText="International Falls, MN (KINL)" id="raobInternationalFalls_MN"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72747"/> <substitute key="stationId" value="72747"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="North Platte, NE (KLBF)" id="raobNorthPlatte_NE" menuText="North Platte, NE (KLBF)" id="raobNorthPlatte_NE"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72562"/> <substitute key="stationId" value="72562"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Little Rock, AR (KLZK)" id="raobLittleRock_AR" menuText="Little Rock, AR (KLZK)" id="raobLittleRock_AR"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72340"/> <substitute key="stationId" value="72340"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Midland, TX (KMAF)" id="raobSanNicholasIsland_CA" menuText="Midland, TX (KMAF)" id="raobSanNicholasIsland_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72265"/> <substitute key="stationId" value="72265"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Minneapolis, MN (KMPX)" id="raobMinneapolis_MN" menuText="Minneapolis, MN (KMPX)" id="raobMinneapolis_MN"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72649"/> <substitute key="stationId" value="72649"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Omaha, NE (KOAX)" id="raobOmaha_NE" menuText="Omaha, NE (KOAX)" id="raobOmaha_NE"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72558"/> <substitute key="stationId" value="72558"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Oklahoma City, OK (KOUN)" id="raobOklahomaCity_OK " menuText="Oklahoma City, OK (KOUN)" id="raobOklahomaCity_OK "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72357"/> <substitute key="stationId" value="72357"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Springfield, MO (KSGF)" id="raobSpringfield_MO" menuText="Springfield, MO (KSGF)" id="raobSpringfield_MO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72440"/> <substitute key="stationId" value="72440"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Topeka, KS (KTOP)" id="raobTopeka_KS" menuText="Topeka, KS (KTOP)" id="raobTopeka_KS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72456"/> <substitute key="stationId" value="72456"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Rapid City, SD (KUNR)" id="raobRapidCity_SD" menuText="Rapid City, SD (KUNR)" id="raobRapidCity_SD"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72662"/> <substitute key="stationId" value="72662"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,162 +21,162 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Albany, NY (KALY)" id="raobAlbany_NY" menuText="Albany, NY (KALY)" id="raobAlbany_NY"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72518"/> <substitute key="stationId" value="72518"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Phillips AAF, Aberdeen, MD (KAPG)" id="raobAberdeen_MD" menuText="Phillips AAF, Aberdeen, MD (KAPG)" id="raobAberdeen_MD"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74002"/> <substitute key="stationId" value="74002"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Gaylord, MI (KAPX)" id="raobGaylord_MI" menuText="Gaylord, MI (KAPX)" id="raobGaylord_MI"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72634"/> <substitute key="stationId" value="72634"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Birmingham, AL (KBMX)" id="raobBirmingham_AL" menuText="Birmingham, AL (KBMX)" id="raobBirmingham_AL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72230"/> <substitute key="stationId" value="72230"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Buffalo, NY (KBUF)" id="raobBuffalo_NY" menuText="Buffalo, NY (KBUF)" id="raobBuffalo_NY"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72528"/> <substitute key="stationId" value="72528"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Caribou, ME (KCAR)" id="raobCaribou_ME" menuText="Caribou, ME (KCAR)" id="raobCaribou_ME"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72712"/> <substitute key="stationId" value="72712"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Chatham, MA (KCHH)" id="raobChatham_MA" menuText="Chatham, MA (KCHH)" id="raobChatham_MA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74494"/> <substitute key="stationId" value="74494"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Charleston, SC (KCHS)" id="raobCharleston_SC" menuText="Charleston, SC (KCHS)" id="raobCharleston_SC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72208"/> <substitute key="stationId" value="72208"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Detroit, MI (KDTX)" id="raobDetroit_MI" menuText="Detroit, MI (KDTX)" id="raobDetroit_MI"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72632"/> <substitute key="stationId" value="72632"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Key West, FL (KEYW)" id="raobKeyWest_FL" menuText="Key West, FL (KEYW)" id="raobKeyWest_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72201"/> <substitute key="stationId" value="72201"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Atlanta, GA (KFFC)" id="raobAtlanta_GA" menuText="Atlanta, GA (KFFC)" id="raobAtlanta_GA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72215"/> <substitute key="stationId" value="72215"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Greensboro, NC (KGSO)" id="raobGreensboro_NC" menuText="Greensboro, NC (KGSO)" id="raobGreensboro_NC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72317"/> <substitute key="stationId" value="72317"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Portland, ME (KGYX)" id="raobPortland_ME" menuText="Portland, ME (KGYX)" id="raobPortland_ME"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74389"/> <substitute key="stationId" value="74389"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cincinnati, OH (KILN)" id="raobCincinnati_OH" menuText="Cincinnati, OH (KILN)" id="raobCincinnati_OH"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72426"/> <substitute key="stationId" value="72426"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Jackson, MS (KJAN)" id="raobJackson_MS" menuText="Jackson, MS (KJAN)" id="raobJackson_MS"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72235"/> <substitute key="stationId" value="72235"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Jacksonville, FL (KJAX)" id="raobJacksonville_FL" menuText="Jacksonville, FL (KJAX)" id="raobJacksonville_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72206"/> <substitute key="stationId" value="72206"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Lake Charles, LA (KLCH)" id="raobLakeCharles_LA" menuText="Lake Charles, LA (KLCH)" id="raobLakeCharles_LA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72240"/> <substitute key="stationId" value="72240"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="New Orleans, LA (KLIX)" id="raobNewOrleans_LA" menuText="New Orleans, LA (KLIX)" id="raobNewOrleans_LA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72233"/> <substitute key="stationId" value="72233"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Wash-Dulles, VA (KIAD)" id="raobWash-Dulles" menuText="Wash-Dulles, VA (KIAD)" id="raobWash-Dulles"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72403"/> <substitute key="stationId" value="72403"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Miami, FL (KMFL)" id="raobMiami_FL" menuText="Miami, FL (KMFL)" id="raobMiami_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72202"/> <substitute key="stationId" value="72202"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Morehead City, NC (KMHX)" id="raobMoreheadCity_NC" menuText="Morehead City, NC (KMHX)" id="raobMoreheadCity_NC"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72305"/> <substitute key="stationId" value="72305"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Nashville, TN (KOHX)" id="raobNashville_TN" menuText="Nashville, TN (KOHX)" id="raobNashville_TN"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72327"/> <substitute key="stationId" value="72327"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Upton, NY (KOKX)" id="raobUpton_NY" menuText="Upton, NY (KOKX)" id="raobUpton_NY"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72501"/> <substitute key="stationId" value="72501"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pittsburgh, PA (KPBZ)" id="raobPittsburgh_PA" menuText="Pittsburgh, PA (KPBZ)" id="raobPittsburgh_PA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72520"/> <substitute key="stationId" value="72520"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Roanoke, VA (KRNK)" id="raobRoanoke_VA" menuText="Roanoke, VA (KRNK)" id="raobRoanoke_VA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72318"/> <substitute key="stationId" value="72318"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Shreveport, LA (KSHV)" id="raobShreveport_LA" menuText="Shreveport, LA (KSHV)" id="raobShreveport_LA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72248"/> <substitute key="stationId" value="72248"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tallahasee, FL (KTAE)" id="raobTallahasee_FL" menuText="Tallahasee, FL (KTAE)" id="raobTallahasee_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72214"/> <substitute key="stationId" value="72214"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tampa Bay, FL (KTBW)" id="raobTampaBay_FL" menuText="Tampa Bay, FL (KTBW)" id="raobTampaBay_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72210"/> <substitute key="stationId" value="72210"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Valparaiso/Eglin, FL (KVPS)" id="raobValparaiso_FL" menuText="Valparaiso/Eglin, FL (KVPS)" id="raobValparaiso_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72221"/> <substitute key="stationId" value="72221"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Wallops Island, VA (KWAL)" id="raobWallopsIsland_VA " menuText="Wallops Island, VA (KWAL)" id="raobWallopsIsland_VA "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72402"/> <substitute key="stationId" value="72402"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Cape Canaveral, FL (KXMR)" id="raobCapeCanaveral_FL" menuText="Cape Canaveral, FL (KXMR)" id="raobCapeCanaveral_FL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74794"/> <substitute key="stationId" value="74794"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Redstone Arsenal, AL (74001)" id="raobRedstoneArsenal_AL" menuText="Redstone Arsenal, AL (74001)" id="raobRedstoneArsenal_AL"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74001"/> <substitute key="stationId" value="74001"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -21,162 +21,162 @@
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tatoosh Island, WA (72798)" id="raobTatooshIsland_WA" menuText="Tatoosh Island, WA (72798)" id="raobTatooshIsland_WA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72798"/> <substitute key="stationId" value="72798"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="South Vandenberg AFB (74606)" id="raobSouthVandenbergAFB" menuText="South Vandenberg AFB (74606)" id="raobSouthVandenbergAFB"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74606"/> <substitute key="stationId" value="74606"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuma, AZ (K1Y7)" id="raobYuma_AZ" menuText="Yuma, AZ (K1Y7)" id="raobYuma_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74004"/> <substitute key="stationId" value="74004"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuma PG Site 2, AZ (K1Y8)" id="raobYuma_AZ" menuText="Yuma PG Site 2, AZ (K1Y8)" id="raobYuma_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74005"/> <substitute key="stationId" value="74005"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuma PG Site 2, AZ (K1Y9)" id="raobYuma_AZ" menuText="Yuma PG Site 2, AZ (K1Y9)" id="raobYuma_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74006"/> <substitute key="stationId" value="74006"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Albuquerque, NM (KABQ)" id="raobAlbuquerque_NM" menuText="Albuquerque, NM (KABQ)" id="raobAlbuquerque_NM"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72365"/> <substitute key="stationId" value="72365"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Boise, ID (KBOI)" id="raobBoise_ID" menuText="Boise, ID (KBOI)" id="raobBoise_ID"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72681"/> <substitute key="stationId" value="72681"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Denver, CO (KDNR)" id="raobDenver_CO" menuText="Denver, CO (KDNR)" id="raobDenver_CO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72469"/> <substitute key="stationId" value="72469"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Desert Rock, NV (KDRA)" id="raobDesertRock_NV" menuText="Desert Rock, NV (KDRA)" id="raobDesertRock_NV"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72387"/> <substitute key="stationId" value="72387"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Edwards AFB, CA (KEDW)" id="raobEdwardsAFB_CA " menuText="Edwards AFB, CA (KEDW)" id="raobEdwardsAFB_CA "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72381"/> <substitute key="stationId" value="72381"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Flagstaff, AZ (KFGZ)" id="raobFlagstaff_AZ" menuText="Flagstaff, AZ (KFGZ)" id="raobFlagstaff_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72376"/> <substitute key="stationId" value="72376"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Glasgow, MT (KGGW)" id="raobGlasgow_MT" menuText="Glasgow, MT (KGGW)" id="raobGlasgow_MT"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72768"/> <substitute key="stationId" value="72768"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Grand Junction, CO (KGJT)" id="raobGrandJunction_CO" menuText="Grand Junction, CO (KGJT)" id="raobGrandJunction_CO"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72476"/> <substitute key="stationId" value="72476"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Elko, NV (KLKN)" id="raobElko_NV" menuText="Elko, NV (KLKN)" id="raobElko_NV"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72582"/> <substitute key="stationId" value="72582"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Las Vegas, NV (KVEF)" id="raobLasVegas_NV" menuText="Las Vegas, NV (KVEF)" id="raobLasVegas_NV"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72388"/> <substitute key="stationId" value="72388"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Medford, OR (KMFR)" id="raobMedford_OR" menuText="Medford, OR (KMFR)" id="raobMedford_OR"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72597"/> <substitute key="stationId" value="72597"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="San Diego, CA (KNKX)" id="raobSanDiego_CA" menuText="San Diego, CA (KNKX)" id="raobSanDiego_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72293"/> <substitute key="stationId" value="72293"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="San Nicholas Island, CA (KNSI)" id="raobSanNicholasIsland_CA" menuText="San Nicholas Island, CA (KNSI)" id="raobSanNicholasIsland_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72291"/> <substitute key="stationId" value="72291"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Pt. Mugu NAWS, CA (KNTD)" id="raobPtMuguNAWS_CA" menuText="Pt. Mugu NAWS, CA (KNTD)" id="raobPtMuguNAWS_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72391"/> <substitute key="stationId" value="72391"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Oakland, CA (KOAK)" id="raobOakland_CA" menuText="Oakland, CA (KOAK)" id="raobOakland_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72493"/> <substitute key="stationId" value="72493"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Spokane, WA (KOTX)" id="raobSpokane_WA" menuText="Spokane, WA (KOTX)" id="raobSpokane_WA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72786"/> <substitute key="stationId" value="72786"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Phoenix (KPSR)" id="raobPheonix" menuText="Phoenix (KPSR)" id="raobPheonix"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="74626"/> <substitute key="stationId" value="74626"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Reno, NV (KREV)" id="raobReno_NV " menuText="Reno, NV (KREV)" id="raobReno_NV "
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72489"/> <substitute key="stationId" value="72489"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Riverton, WY (KRIW)" id="raobRiverton_WY" menuText="Riverton, WY (KRIW)" id="raobRiverton_WY"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72672"/> <substitute key="stationId" value="72672"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Salt Lake City, UT (KSLC)" id="raobSaltLakeCity_UT" menuText="Salt Lake City, UT (KSLC)" id="raobSaltLakeCity_UT"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72572"/> <substitute key="stationId" value="72572"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Salem, OR (KSLE)" id="raobSalem_OR" menuText="Salem, OR (KSLE)" id="raobSalem_OR"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72694"/> <substitute key="stationId" value="72694"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Great Falls, MT (KTFX)" id="raobGreatFalls_MT" menuText="Great Falls, MT (KTFX)" id="raobGreatFalls_MT"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72776"/> <substitute key="stationId" value="72776"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Tucson, AZ (KTWC)" id="raobTucson_AZ" menuText="Tucson, AZ (KTWC)" id="raobTucson_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72274"/> <substitute key="stationId" value="72274"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Quillayute, WA (KUIL)" id="raobQuillayute_WA" menuText="Quillayute, WA (KUIL)" id="raobQuillayute_WA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72797"/> <substitute key="stationId" value="72797"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Vanderberg AFB, CA (KVBG)" id="raobVanderbergAFB_CA" menuText="Vanderberg AFB, CA (KVBG)" id="raobVanderbergAFB_CA"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72393"/> <substitute key="stationId" value="72393"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="White Sands, NM (KWSD)" id="raobWhiteSands_NM" menuText="White Sands, NM (KWSD)" id="raobWhiteSands_NM"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72269"/> <substitute key="stationId" value="72269"/>
</contribute> </contribute>
<contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml" <contribute xsi:type="bundleItem" file="bundles/UpperAirRaob.xml"
menuText="Yuma (Marine), AZ (KYUM)" id="raobYuma(Marine)_AZ" menuText="Yuma (Marine), AZ (KYUM)" id="raobYuma(Marine)_AZ"
editorType="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"> editorType="gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor">
<substitute key="stationId" value="72280"/> <substitute key="stationId" value="72280"/>
</contribute> </contribute>
</menuTemplate> </menuTemplate>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.raytheon.uf.viz.collaboration.comm.xmpp</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,8 @@
#Fri Jul 20 17:19:32 CDT 2012
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6

View file

@ -0,0 +1,17 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Xmpp
Bundle-SymbolicName: com.raytheon.uf.viz.collaboration.comm.xmpp;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.raytheon.uf.viz.collaboration.comm.xmpp.Activator
Bundle-Vendor: RAYTHEON
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ecf;bundle-version="3.1.300",
org.eclipse.ecf.provider.xmpp;bundle-version="3.2.0",
org.eclipse.ecf.provider;bundle-version="4.2.100",
org.eclipse.ecf.presence;bundle-version="2.0.0",
org.eclipse.ecf.sharedobject;bundle-version="2.2.100",
org.jivesoftware.smack;bundle-version="3.1.100"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Export-Package: com.raytheon.uf.viz.collaboration.comm.xmpp

View file

@ -0,0 +1,5 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ecf.containerFactory">
<containerFactory
class="com.raytheon.uf.viz.collaboration.comm.xmpp.internal.XMPPContainerInstantiator"
description="AWIPS XMPP (Jabber)"
name="com.raytheon.uf.viz.collaboration.comm.xmpp">
</containerFactory>
</extension>
</plugin>

View file

@ -0,0 +1,30 @@
package com.raytheon.uf.viz.collaboration.comm.xmpp;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private static BundleContext context;
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
}
}

View file

@ -0,0 +1,356 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp;
import java.io.IOException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.events.ContainerConnectedEvent;
import org.eclipse.ecf.core.events.ContainerConnectingEvent;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.core.sharedobject.SharedObjectAddException;
import org.eclipse.ecf.core.user.User;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.internal.provider.xmpp.Messages;
import org.eclipse.ecf.internal.provider.xmpp.XmppPlugin;
import org.eclipse.ecf.internal.provider.xmpp.smack.ECFConnectionObjectPacketEvent;
import org.eclipse.ecf.presence.chatroom.IChatRoomContainer;
import org.eclipse.ecf.presence.chatroom.IChatRoomManager;
import org.eclipse.ecf.presence.im.IChatManager;
import org.eclipse.ecf.presence.roster.IRosterManager;
import org.eclipse.ecf.provider.comm.AsynchEvent;
import org.eclipse.ecf.provider.comm.ConnectionCreateException;
import org.eclipse.ecf.provider.comm.ISynchAsynchConnection;
import org.eclipse.ecf.provider.generic.ContainerMessage;
import org.eclipse.osgi.util.NLS;
import org.jivesoftware.smack.XMPPException;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.XMPPChatRoomContainer;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.XMPPChatRoomManager;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.XMPPContainerPresenceHelper;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.smack.ECFConnection;
/**
* Extends the ECF XMPPContainer but overrides any methods which use the
* chatRoomManager or containerPresenceHelper to use viz specific instances.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 20, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPContainer extends org.eclipse.ecf.provider.xmpp.XMPPContainer {
/**
* custom chat room manager.
*/
XMPPChatRoomManager chatRoomManager = null;
XMPPContainerPresenceHelper presenceHelper = null;
public XMPPContainer() throws Exception {
this(DEFAULT_KEEPALIVE);
}
public XMPPContainer(int ka) throws Exception {
super(ka);
chatRoomManager = new XMPPChatRoomManager(getID());
presenceHelper = new XMPPContainerPresenceHelper(this);
}
public XMPPContainer(String userhost, int ka) throws Exception {
super(userhost, ka);
chatRoomManager = new XMPPChatRoomManager(getID());
presenceHelper = new XMPPContainerPresenceHelper(this);
}
/**
* Overridden to return custom chatRoomManager
*/
@Override
public IChatRoomManager getChatRoomManager() {
return chatRoomManager;
}
/**
* Overridden to use rosterManager from custom presenceHelper
*/
@Override
public IRosterManager getRosterManager() {
return presenceHelper.getRosterManager();
}
/**
* Overridden to use chatManager from custom presenceHelper
*/
@Override
public IChatManager getChatManager() {
return presenceHelper.getChatManager();
}
/**
* Overridden to disconnect custom presenceHelper and connect our own
* instead. Also takes the functionality from the connect method in
* ClientSOContainer so that we can complete all the necessary functionality
* of the super's super method in our own method. The super method
* originally called super with a different presence helper id and that
* would break part of our functionality
*/
@Override
public void connect(ID remote, IConnectContext joinContext)
throws ContainerConnectException {
try {
getSharedObjectManager().addSharedObject(presenceHelperID,
presenceHelper, null);
// following taken from
// ClientSOContainer.connect(ID,IConnectContext);
try {
if (isClosing)
throw new IllegalStateException("Container closing"); //$NON-NLS-1$
if (remote == null)
throw new ContainerConnectException(
"targetID cannot be null"); //$NON-NLS-1$
Object response = null;
synchronized (getConnectLock()) {
// Throw if already connected
if (isConnected())
throw new IllegalStateException(
"Container already connected connectedID=" + getConnectedID()); //$NON-NLS-1$
// Throw if connecting
if (isConnecting())
throw new IllegalStateException("Container connecting"); //$NON-NLS-1$
// else we're entering connecting state
// first notify synchonously
final ISynchAsynchConnection aConnection = createConnection(
remote, joinContext);
setStateConnecting(aConnection);
fireContainerEvent(new ContainerConnectingEvent(
this.getID(), remote, joinContext));
final Object connectData = getConnectData(remote,
joinContext);
final int connectTimeout = getConnectTimeout();
synchronized (aConnection) {
try {
// Make connect call
response = aConnection.connect(remote, connectData,
connectTimeout);
} catch (final ECFException e) {
if (getConnection() != aConnection)
disconnect(aConnection);
else
setStateDisconnected(aConnection);
throw e;
}
// If not in correct state, disconnect and return
if (getConnection() != aConnection) {
disconnect(aConnection);
throw new IllegalStateException(
"Container connect failed because not in correct state"); //$NON-NLS-1$
}
ID serverID = null;
try {
serverID = handleConnectResponse(remote, response);
} catch (final Exception e) {
setStateDisconnected(aConnection);
throw e;
}
setStateConnected(serverID, aConnection);
// notify listeners
fireContainerEvent(new ContainerConnectedEvent(
this.getID(), remoteServerID));
aConnection.start();
}
}
} catch (XMPPException e) {
throw new ContainerConnectException(e.getMessage(), e);
} catch (final ECFException e) {
final IStatus s = e.getStatus();
throw new ContainerConnectException(s.getMessage(),
s.getException());
} catch (final Exception e) {
throw new ContainerConnectException(e.getLocalizedMessage(), e);
}
XmppPlugin.getDefault().registerService(this);
} catch (final ContainerConnectException e) {
disconnect();
throw e;
} catch (final SharedObjectAddException e1) {
disconnect();
throw new ContainerConnectException(NLS.bind(
Messages.XMPPContainer_EXCEPTION_ADDING_SHARED_OBJECT,
presenceHelperID), e1);
}
// end ClientSOContainer code
getSharedObjectManager().removeSharedObject(presenceHelperID);
try {
getSharedObjectManager().addSharedObject(presenceHelperID,
presenceHelper, null);
} catch (SharedObjectAddException e) {
disconnect();
throw new ContainerConnectException(NLS.bind(
Messages.XMPPContainer_EXCEPTION_ADDING_SHARED_OBJECT,
presenceHelperID), e);
}
}
/**
* Need to override this method from ClientSOContainer so that our connect
* method can set the connection and the connectionState and the
* remoteServerID
*
* Taken from ECF.
*
* @param serverID
* @param conn
*/
private void setStateConnected(ID serverID, ISynchAsynchConnection conn) {
connectionState = CONNECTED;
connection = conn;
remoteServerID = serverID;
}
/**
* Need to override this method out of ClientSOContainer so that our connect
* method can set the connectionState and disconnect the connection
*
* Taken from ECF
*
*/
private void setStateDisconnected(ISynchAsynchConnection conn) {
disconnect(conn);
connectionState = DISCONNECTED;
connection = null;
remoteServerID = null;
}
/**
* Need to override this method out of ClientSOContainer so that our connect
* method can set the connectionState and the connection
*
* Taken from ECF
*
* @param conn
*/
private void setStateConnecting(ISynchAsynchConnection conn) {
connectionState = CONNECTING;
connection = conn;
}
/**
* Overridden to disconnect custom chatRoomManager and custom presenceHelper
*/
@Override
public void disconnect() {
super.disconnect();
chatRoomManager.setConnection(null, null, null);
presenceHelper.disconnect();
}
/**
* Overridden to return custom chatRoomManager
*/
@Override
public void dispose() {
super.dispose();
chatRoomManager.dispose();
}
/**
* Overriden to set connection in custom chatRoomManager and to set user in
* custom presenceHelper
*/
@Override
protected ID handleConnectResponse(ID originalTarget, Object serverData)
throws Exception {
ID result = super.handleConnectResponse(originalTarget, serverData);
chatRoomManager.setConnection(getConnectNamespace(), originalTarget,
getECFConnection());
presenceHelper.setUser(new User(originalTarget));
return result;
}
/**
* Overriden to cast ECFConnection to viz implementation
*/
public ECFConnection getECFConnection() {
return (ECFConnection) super.getConnection();
}
/**
* Overriden to create viz ECFConnection
*/
@Override
protected ISynchAsynchConnection createConnection(ID remoteSpace,
Object data) throws ConnectionCreateException {
final boolean google = isGoogle(remoteSpace);
return new ECFConnection(google, getConnectNamespace(), receiver);
}
/**
* Adapted from super.processAsynch to use custom chatRoomManager for chat
* events.
*/
@Override
protected void processAsynch(AsynchEvent e) {
try {
if (e instanceof ECFConnectionObjectPacketEvent) {
// It's an ECF object message
final ECFConnectionObjectPacketEvent evt = (ECFConnectionObjectPacketEvent) e;
final Object obj = evt.getObjectValue();
// this should be a ContainerMessage
final Object cm = deserializeContainerMessage((byte[]) obj);
if (cm == null)
super.processAsynch(e);
final ContainerMessage contMessage = (ContainerMessage) cm;
final IChatRoomContainer chat = chatRoomManager
.findReceiverChatRoom(contMessage.getToContainerID());
if (chat != null && chat instanceof XMPPChatRoomContainer) {
final XMPPChatRoomContainer cont = (XMPPChatRoomContainer) chat;
cont.handleContainerMessage(contMessage);
return;
}
super.processAsynch(e);
}
} catch (final IOException except) {
log(NLS.bind(Messages.XMPPContainer_EXCEPTION_HANDLING_ASYCH_EVENT,
e), except);
}
super.processAsynch(e);
}
}

View file

@ -0,0 +1,235 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.core.sharedobject.SharedObjectAddException;
import org.eclipse.ecf.internal.provider.xmpp.events.ChatMembershipEvent;
import org.eclipse.ecf.internal.provider.xmpp.events.IQEvent;
import org.eclipse.ecf.internal.provider.xmpp.events.MessageEvent;
import org.eclipse.ecf.internal.provider.xmpp.events.PresenceEvent;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.chatroom.IChatRoomParticipantListener;
import org.eclipse.ecf.provider.generic.SOWrapper;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import com.raytheon.uf.viz.collaboration.comm.xmpp.XMPPContainer;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.smack.ECFConnection;
/**
* Override the ECF XMPPChatRoomContainer but provide a custom viz
* XMPPChatRoomContainerHelper
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 20, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPChatRoomContainer extends
org.eclipse.ecf.internal.provider.xmpp.XMPPChatRoomContainer {
private static final String CONTAINER_HELPER_ID = XMPPContainer.class
.getName() + ".xmppgroupchathandler"; //$NON-NLS-1$
private ID containerHelperID;
/**
* Use viz version of chatRoomContainerHelper.
*/
private XMPPChatRoomContainerHelper containerHelper;
public XMPPChatRoomContainer(ECFConnection conn, Namespace usernamespace)
throws IDCreateException {
super(conn, usernamespace);
this.containerHelperID = IDFactory.getDefault().createStringID(
CONTAINER_HELPER_ID);
this.containerHelper = new XMPPChatRoomContainerHelper(usernamespace,
getXMPPConnection());
}
/**
* Overridden to use custom containerHelper.
*/
@Override
public void addChatRoomParticipantListener(
IChatRoomParticipantListener participantListener) {
if (containerHelper != null) {
containerHelper.addChatParticipantListener(participantListener);
}
}
/**
* Overridden to use custom containerHelper.
*/
@Override
public void addMessageListener(IIMMessageListener listener) {
containerHelper.addChatRoomMessageListener(listener);
}
/**
* Overridden to use custom containerHelper.
*/
@Override
protected void addSharedObjectToContainer(ID remote)
throws SharedObjectAddException {
getSharedObjectManager().addSharedObject(containerHelperID,
containerHelper, new HashMap());
}
/**
* Overridden to clean up custom containerHelper.
*/
@Override
protected void cleanUpConnectFail() {
super.cleanUpConnectFail();
if (containerHelper != null) {
getSharedObjectManager().removeSharedObject(containerHelperID);
containerHelper = null;
containerHelperID = null;
}
}
/**
* Overridden to connect custom containerHelper.
*/
@Override
public void connect(ID remote, IConnectContext connectContext)
throws ContainerConnectException {
super.connect(remote, connectContext);
containerHelper.setRoomID(remoteServerID);
}
/**
* Overridden to disconnect custom containerHelper.
*/
@Override
public void disconnect() {
super.disconnect();
if (containerHelper != null)
containerHelper.disconnect();
}
/**
* Overridden to dispose custom containerHelper.
*/
@Override
public void dispose() {
if (containerHelperID != null) {
getSharedObjectManager().removeSharedObject(containerHelperID);
containerHelperID = null;
}
super.dispose();
if (containerHelper != null)
containerHelper.dispose(getID());
containerHelper = null;
}
/**
* Overridden to use custom containerHelper.
*/
@Override
public ID[] getChatRoomParticipants() {
return containerHelper.getChatRoomParticipants();
}
/**
* Overridden to use custom containerHelper.
*/
@Override
public void removeChatRoomParticipantListener(
IChatRoomParticipantListener participantListener) {
if (containerHelper != null) {
containerHelper.removeChatParticipantListener(participantListener);
}
}
/**
* Overridden to use custom containerHelper.
*/
@Override
public void removeMessageListener(IIMMessageListener listener) {
containerHelper.removeChatRoomMessageListener(listener);
}
/**
* Overridden to use custom containerHelperID.
*/
@Override
protected void handleChatMessage(Message mess) throws IOException {
final SOWrapper wrap = getSharedObjectWrapper(containerHelperID);
if (wrap != null) {
wrap.deliverEvent(new MessageEvent(mess));
}
}
/**
* Overridden to use custom containerHelperID.
*/
@Override
protected void handleIQMessage(IQ mess) throws IOException {
final SOWrapper wrap = getSharedObjectWrapper(containerHelperID);
if (wrap != null) {
wrap.deliverEvent(new IQEvent(mess));
}
}
/**
* Overridden to use custom containerHelperID.
*/
@Override
protected void handlePresenceMessage(Presence mess) throws IOException {
final SOWrapper wrap = getSharedObjectWrapper(containerHelperID);
if (wrap != null) {
wrap.deliverEvent(new PresenceEvent(mess));
}
}
/**
* Overridden to use custom containerHelperID.
*/
@Override
protected void handleChatMembershipEvent(String from, boolean add) {
final SOWrapper wrap = getSharedObjectWrapper(containerHelperID);
if (wrap != null) {
wrap.deliverEvent(new ChatMembershipEvent(from, add));
}
}
}

View file

@ -0,0 +1,178 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.internal.provider.xmpp.events.ChatMembershipEvent;
import org.eclipse.ecf.internal.provider.xmpp.events.PresenceEvent;
import org.eclipse.ecf.internal.provider.xmpp.smack.ECFConnection;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.chatroom.IChatRoomParticipantListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Presence;
/**
* Extend the ECF XMPPChatRoomContainerHelper with three changes (1) add
* properties to presence events in a room. (2) expose methods needed by the Viz
* version of XMPPChatRoomContainer. (3) disable the default chatMembership
* events and instead fire ChatMembershipEvents when the presence changes.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 20, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPChatRoomContainerHelper extends
org.eclipse.ecf.internal.provider.xmpp.XMPPChatRoomContainerHelper {
/**
* Need our own list to track who is in the room.
*/
private final List<ID> chatRoomContainerParticipants = Collections
.synchronizedList(new ArrayList<ID>());
public XMPPChatRoomContainerHelper(Namespace usernamespace,
XMPPConnection conn) {
super(usernamespace, conn);
}
/**
* exposed method to this package.
*/
@Override
protected void setRoomID(ID roomID) {
super.setRoomID(roomID);
}
/**
* exposed method to this package.
*/
@Override
protected void disconnect() {
super.disconnect();
}
/**
* exposed method to this package.
*/
@Override
protected void addChatParticipantListener(
IChatRoomParticipantListener listener) {
super.addChatParticipantListener(listener);
}
/**
* exposed method to this package.
*/
@Override
protected void removeChatParticipantListener(
IChatRoomParticipantListener listener) {
super.removeChatParticipantListener(listener);
}
/**
* exposed method to this package.
*/
@Override
protected void addChatRoomMessageListener(IIMMessageListener msgListener) {
super.addChatRoomMessageListener(msgListener);
}
/**
* exposed method to this package.
*/
@Override
protected ID createUserIDFromName(String name) {
return super.createUserIDFromName(name);
}
/**
* adapted from super.createIPresence, but modified to add properties from
* the packet.
*/
@Override
protected IPresence createIPresence(Presence xmppPresence) {
final String status = xmppPresence.getStatus();
final IPresence newPresence = new org.eclipse.ecf.presence.Presence(
createIPresenceType(xmppPresence), status,
createIPresenceMode(xmppPresence),
ECFConnection.getPropertiesFromPacket(xmppPresence));
return newPresence;
}
/**
* Overridden to also fire ChatMembershipEvent, see
* handleChatMembershipEvent for more information on why this is done.
*/
@Override
protected void handlePresenceEvent(PresenceEvent evt) {
super.handlePresenceEvent(evt);
final Presence xmppPresence = evt.getPresence();
final String from = canonicalizeRoomFrom(xmppPresence.getFrom());
final ID fromID = createUserIDFromName(from);
if (xmppPresence.getType().equals(Presence.Type.available)) {
if (!chatRoomContainerParticipants.contains(fromID)) {
chatRoomContainerParticipants.add(fromID);
super.handleChatMembershipEvent(new ChatMembershipEvent(
xmppPresence.getFrom(), true));
}
} else {
chatRoomContainerParticipants.remove(fromID);
super.handleChatMembershipEvent(new ChatMembershipEvent(
xmppPresence.getFrom(), false));
}
}
/**
* The ECF version of this class will not always correctly fire these events
* for the user that created this room. The reason is because
* XMPPChatRoomManager.createChatRoom creates a temporary MultiUserChat to
* create the room but this MultiUserChat registers with the
* RoomListenerMultiplexor and it does not deregister until finalize. When
* we connect to the room it will create a second MultiUserChat and it is
* possible they are both registered. When the temporary chat is garbage
* collected it removes the room from the RoomListenerMultiplexor and events
* for that room are ignored. Most events do not come from the
* RoomListenerMultiplexor so there is no problems but the
* ChatMembershipEvent comes from that and breaks sometimes so we disable it
* and instead fire these events from handlePresenceEvent since that event
* is fired separately from the RoomListenerMultiplexor.
*/
@Override
protected void handleChatMembershipEvent(ChatMembershipEvent evt) {
; // disabled
}
}

View file

@ -0,0 +1,276 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal;
import java.util.Map;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.internal.provider.xmpp.Messages;
import org.eclipse.ecf.presence.chatroom.ChatRoomCreateException;
import org.eclipse.ecf.presence.chatroom.IChatRoomContainer;
import org.eclipse.ecf.presence.chatroom.IChatRoomInfo;
import org.eclipse.ecf.provider.xmpp.identity.XMPPRoomID;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.RoomInfo;
import com.raytheon.uf.viz.collaboration.comm.xmpp.internal.smack.ECFConnection;
/**
* Extend the ECF XMPPChatRoomManager but add the ability to use a custom viz
* chat room container.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 20, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPChatRoomManager extends
org.eclipse.ecf.internal.provider.xmpp.XMPPChatRoomManager {
private static final String PROP_XMPP_SUBJECT = "subject";
/**
* Super has ecfConnection but it is private and we need it.
*/
private ECFConnection ecfConnection = null;
/**
* Super has connectNamespace but it is private and we need it.
*/
private Namespace connectNamespace = null;
public XMPPChatRoomManager(ID containerID) {
super(containerID);
}
/**
* Overriden to so we can grab the ecfConnection and namespace
*/
public void setConnection(Namespace connectNamespace, ID connectedID,
ECFConnection connection) {
super.setConnection(connectNamespace, connectedID, connection);
this.connectNamespace = connectNamespace;
this.ecfConnection = connection;
}
/**
* Overriden to wrap the roomInfo in a custom roomInfo.
*/
@Override
protected IChatRoomInfo getChatRoomInfo(ID roomID) {
IChatRoomInfo result = super.getChatRoomInfo(roomID);
if (result != null) {
result = new ECFRoomInfo(result);
}
return result;
}
/**
* Overriden to wrap the roomInfo in a custom roomInfo.
*/
@Override
public IChatRoomInfo getChatRoomInfo(String roomname) {
IChatRoomInfo result = super.getChatRoomInfo(roomname);
if (result != null) {
result = new ECFRoomInfo(result);
} else if (ecfConnection != null) {
// If the result is null then it is possible that ecf silently
// disgarded an exception from xmpp, we would like some way to be
// able to capture that exception so this code will
// attempt to find the room itself and log errors.
Exception exception = null;
String mucName = null;
try {
XMPPConnection conn = ecfConnection.getXMPPConnection();
XMPPRoomID roomID = new XMPPRoomID(connectNamespace, conn,
roomname);
mucName = roomID.getMucString();
RoomInfo info = MultiUserChat.getRoomInfo(conn, mucName);
if (info != null) {
// Theoretically this will never hit but if it does there is
// no way of getting a super.ECFRoomInfo even
// though we know the room exists, so just log it.
System.err
.println("XMPPChatRoomManager cannot find info for room "
+ roomname + " but it exists.");
}
} catch (XMPPException e) {
if (e.getXMPPError().getCode() != 404) {
// 404 is considered normal, everything else is bad
exception = e;
}
} catch (final Exception e) {
exception = e;
}
if (exception != null) {
System.err
.println("XMPPChatRoomManager cannot find info for room "
+ roomname
+ " when looking for "
+ String.valueOf(mucName));
exception.printStackTrace();
}
}
return result;
}
/**
* Overriden to use the same nickname that is used when joining.
*/
@Override
public IChatRoomInfo createChatRoom(String roomname, Map properties)
throws ChatRoomCreateException {
if (roomname == null)
throw new ChatRoomCreateException(roomname,
Messages.XMPPChatRoomManager_EXCEPTION_ROOM_CANNOT_BE_NULL);
try {
String nickname = ecfConnection.getXMPPConnection().getUser();
final String server = ecfConnection.getXMPPConnection().getHost();
final String domain = (properties == null) ? XMPPRoomID.DOMAIN_DEFAULT
: (String) properties.get(PROP_XMPP_CONFERENCE);
final String conference = XMPPRoomID.fixConferenceDomain(domain,
server);
final String roomID = roomname + XMPPRoomID.AT_SIGN + conference;
// create proxy to the room
final MultiUserChat muc = new MultiUserChat(
ecfConnection.getXMPPConnection(), roomID);
if (!checkRoom(conference, roomID)) {
// otherwise create a new one
/**
* This is the reason we override super.createChatRoom, when we
* join it only uses the username, not then host so we must do
* the same here or a user departed event is triggered for
* user@host when user arrives.
*/
if (nickname.contains("@")) {
nickname = nickname.split("@")[0];
}
muc.create(nickname);
muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
final String subject = (properties == null) ? null
: (String) properties.get(PROP_XMPP_SUBJECT);
if (subject != null)
muc.changeSubject(subject);
}
} catch (final XMPPException e) {
throw new ChatRoomCreateException(roomname, e.getMessage(), e);
}
return getChatRoomInfo(roomname);
}
/**
* Custom roomInfo that wraps another roomInfo and overrides
* createChatRoomContainer to return viz container.
*/
class ECFRoomInfo implements IChatRoomInfo {
IChatRoomInfo realInfo;
public ECFRoomInfo(IChatRoomInfo realInfo) {
this.realInfo = realInfo;
}
public String getDescription() {
return realInfo.getDescription();
}
public String getSubject() {
return realInfo.getSubject();
}
public ID getRoomID() {
return realInfo.getRoomID();
}
public int getParticipantsCount() {
return realInfo.getParticipantsCount();
}
public String getName() {
return realInfo.getName();
}
public boolean isPersistent() {
return realInfo.isPersistent();
}
public boolean requiresPassword() {
return realInfo.requiresPassword();
}
public boolean isModerated() {
return realInfo.isModerated();
}
public ID getConnectedID() {
return realInfo.getConnectedID();
}
public Object getAdapter(Class adapter) {
return realInfo.getAdapter(adapter);
}
/**
* Adapted from the ECF version of ECFRoomInfo but changed to return our
* custom container.
*/
public IChatRoomContainer createChatRoomContainer()
throws ContainerCreateException {
XMPPChatRoomContainer chatContainer = null;
if (ecfConnection == null)
throw new ContainerCreateException(
Messages.XMPPChatRoomManager_EXCEPTION_CONTAINER_DISCONNECTED);
try {
chatContainer = new XMPPChatRoomContainer(ecfConnection,
connectNamespace);
addChat(chatContainer);
return chatContainer;
} catch (final IDCreateException e) {
throw new ContainerCreateException(
Messages.XMPPChatRoomManager_EXCEPTION_CREATING_CHAT_CONTAINER,
e);
}
}
public String toString() {
return realInfo.toString();
}
}
}

View file

@ -0,0 +1,85 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.ContainerTypeDescription;
import com.raytheon.uf.viz.collaboration.comm.xmpp.XMPPContainer;
/**
*
* Extends the ECF XMPPContainerInstantiator to create a Viz specific container
* with fixes needed for Viz.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 23, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPContainerInstantiator extends
org.eclipse.ecf.internal.provider.xmpp.XMPPContainerInstantiator {
/**
* Adapted from super.createInstance, only change is that it returns the Viz
* XMPPContainer instead of the ECF XMPPContainer
*/
@Override
public XMPPContainer createInstance(ContainerTypeDescription description,
Object[] args) throws ContainerCreateException {
try {
Integer ka = new Integer(XMPPContainer.DEFAULT_KEEPALIVE);
String name = null;
if (args != null) {
if (args.length > 0) {
name = (String) args[0];
if (args.length > 1) {
ka = getIntegerFromArg(args[1]);
}
}
}
if (name == null) {
if (ka == null) {
return new XMPPContainer();
} else {
return new XMPPContainer(ka.intValue());
}
} else {
if (ka == null) {
ka = new Integer(XMPPContainer.DEFAULT_KEEPALIVE);
}
return new XMPPContainer(name, ka.intValue());
}
} catch (Exception e) {
throw new ContainerCreateException(
"Exception creating generic container", e);
}
}
}

View file

@ -0,0 +1,494 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.core.user.User;
import org.eclipse.ecf.internal.provider.xmpp.events.IQEvent;
import org.eclipse.ecf.internal.provider.xmpp.events.PresenceEvent;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresenceListener;
import org.eclipse.ecf.presence.IPresenceSender;
import org.eclipse.ecf.presence.roster.IRoster;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.roster.IRosterGroup;
import org.eclipse.ecf.presence.roster.IRosterItem;
import org.eclipse.ecf.presence.roster.IRosterListener;
import org.eclipse.ecf.presence.roster.IRosterManager;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionListener;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionSender;
import org.eclipse.ecf.provider.xmpp.XMPPContainer;
import org.eclipse.ecf.provider.xmpp.identity.XMPPID;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.RosterPacket;
/**
* Viz specific implementation of the XMPPContainerPresenceHelper which fixes a
* bug that causes users to disappear from rosters when they log out when they
* are in multiple groups. This class no handles all presence events when a user
* becomes unavaialble, all other events are handled by the ECF version.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 25, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class XMPPContainerPresenceHelper extends
org.eclipse.ecf.internal.provider.xmpp.XMPPContainerPresenceHelper {
/**
* Have our own roster manager to track listeners.
*/
private VizRosterManager rosterManager;
public XMPPContainerPresenceHelper(XMPPContainer container) {
super(container);
rosterManager = new VizRosterManager();
}
/**
* This is overriden because when a roster packet is delivered with a new
* name then the ecf implementation does not change the name, this will
* change it before letting the ecf connection handle the event normally.
*/
@Override
protected void handleIQEvent(IQEvent evt) {
final IQ iq = evt.getIQ();
if (iq instanceof RosterPacket) {
final RosterPacket rosterPacket = (RosterPacket) iq;
if (rosterPacket.getType() == IQ.Type.SET) {
for (RosterPacket.Item item : rosterPacket.getRosterItems()) {
final RosterPacket.ItemType itemType = item.getItemType();
if (itemType == RosterPacket.ItemType.to
|| itemType == RosterPacket.ItemType.both) {
XMPPID newID = createIDFromName(item.getUser());
@SuppressWarnings("unchecked")
Collection<Object> items = roster.getItems();
synchronized (items) {
updateRosterName(items, newID, item.getName());
}
}
}
}
}
super.handleIQEvent(evt);
}
/**
* Method to recursively find roster entries that match the user id provided
* and change the name of the user in the roster entry.
*
* @param rosterItems
* @param id
* @param name
*/
private void updateRosterName(Collection<Object> rosterItems, XMPPID id,
String name) {
if (name == null || name.isEmpty()) {
return;
}
for (Object obj : rosterItems) {
if (obj instanceof IRosterGroup) {
@SuppressWarnings("unchecked")
Collection<Object> items = ((IRosterGroup) obj).getEntries();
synchronized (items) {
updateRosterName(items, id, name);
}
} else if (obj instanceof IRosterEntry) {
IRosterEntry entry = (IRosterEntry) obj;
if (entry.getUser().getID().equals(id)) {
((User) entry.getUser()).setName(name);
}
}
}
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it can call a custom version of updatePresence when the presence
* type is unavaialble.
*/
@Override
protected void handlePresenceEvent(PresenceEvent evt) {
if (evt.getPresence().getType() == Presence.Type.unavailable) {
final Presence xmppPresence = evt.getPresence();
final String from = xmppPresence.getFrom();
final IPresence newPresence = createIPresence(xmppPresence);
final XMPPID fromID = createIDFromName(from);
updatePresence(fromID, newPresence);
rosterManager.notifyPresenceListeners(fromID, newPresence);
} else {
super.handlePresenceEvent(evt);
}
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it can call a custom version of updatePresenceInGroup and
* updatePresenceForMatchingEntry, it also only handles cases of removal.
*/
private void updatePresence(XMPPID fromID, IPresence newPresence) {
@SuppressWarnings("unchecked")
final Collection<Object> rosterItems = roster.getItems();
List<IRosterEntry> newEntrys = new ArrayList<IRosterEntry>();
synchronized (rosterItems) {
for (final Iterator<Object> i = rosterItems.iterator(); i.hasNext();) {
final IRosterItem item = (IRosterItem) i.next();
if (item instanceof IRosterGroup) {
IRosterEntry[] es = updatePresenceInGroup(
(IRosterGroup) item, fromID, newPresence);
for (int j = 0; j < es.length; j++) {
newEntrys.add(es[j]);
}
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) {
IRosterEntry entry = updatePresenceForMatchingEntry(
(org.eclipse.ecf.presence.roster.RosterEntry) item,
fromID, newPresence);
if (entry != null)
newEntrys.add(entry);
}
}
}
IRosterEntry[] entrys = newEntrys.toArray(new IRosterEntry[] {});
if (entrys.length > 0) {
for (int i = 0; i < entrys.length; i++) {
removeItemFromRoster(rosterItems, fromID);
}
}
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it can call a custom version of updatePresenceForMatchingEntry
*/
private IRosterEntry[] updatePresenceInGroup(IRosterGroup group,
XMPPID fromID, IPresence newPresence) {
List<IRosterEntry> results = new ArrayList<IRosterEntry>();
@SuppressWarnings("unchecked")
final Collection<Object> groupEntries = group.getEntries();
synchronized (groupEntries) {
for (final Iterator<Object> i = groupEntries.iterator(); i
.hasNext();) {
IRosterEntry newEntry = updatePresenceForMatchingEntry(
(org.eclipse.ecf.presence.roster.RosterEntry) i.next(),
fromID, newPresence);
if (newEntry != null)
results.add(newEntry);
}
}
return results.toArray(new IRosterEntry[] {});
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it can call a custom version of removeEntryFromRoster, it has also
* been simplified to handle only cases of removal when the presence type is
* unavaialble.
*/
private IRosterEntry updatePresenceForMatchingEntry(
org.eclipse.ecf.presence.roster.RosterEntry entry, XMPPID fromID,
IPresence newPresence) {
final IUser user = entry.getUser();
XMPPID oldID = (XMPPID) user.getID();
// If the username/host part matches that means we either have to update
// the resource, or create a new client
if (oldID.equals(fromID)) {
return removeEntryFromRoster(oldID, entry, newPresence, user);
} else if (oldID.getUsernameAtHost().equals(fromID.getUsernameAtHost())) {
return entry;
}
return null;
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it can call a custom version of countClientsInRoster, it also uses
* the results of this method differently
*/
private IRosterEntry removeEntryFromRoster(XMPPID oldID,
org.eclipse.ecf.presence.roster.RosterEntry entry,
IPresence newPresence, IUser user) {
if (countClientsInRoster(oldID) > 0) {
// remove this client from roster
return entry;
} else {
// Last one, so we set resource to null and set presence to
// unavailable
oldID.setResourceName(null);
entry.setPresence(newPresence);
rosterManager.notifyRosterUpdate(entry);
return null;
}
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it will return the number of entries that have the same name/hose
* but a different resource. Returning the number of users with same
* name/host even if they have the same resource is what causes the ECF
* version to delete users that are in multiple groups. For a user that is
* not logged in more than once this will always return 0.
*/
private int countClientsInRosterGroup(
org.eclipse.ecf.presence.roster.RosterGroup group, XMPPID oldID) {
@SuppressWarnings("unchecked")
Collection<Object> groupItems = group.getEntries();
int count = 0;
for (final Iterator<Object> i = groupItems.iterator(); i.hasNext();) {
final IRosterItem item = (IRosterItem) i.next();
if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) {
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item;
XMPPID entryID = (XMPPID) entry.getUser().getID();
if (!entryID.equals(oldID)
&& entryID.getUsernameAtHost().equals(
oldID.getUsernameAtHost()))
count++;
}
}
return count;
}
/**
* This method has been adapted from the ECF XMPPContainerPresenceHelper so
* that it will return the number of entries that have the same name/hose
* but a different resource. Returning the number of users with same
* name/host even if they have the same resource is what causes the ECF
* version to delete users that are in multiple groups. For a user that is
* not logged in more than once this will always return 0.
*/
private int countClientsInRoster(XMPPID oldID) {
@SuppressWarnings("unchecked")
Collection<Object> rosterItems = roster.getItems();
int count = 0;
synchronized (rosterItems) {
for (final Iterator<Object> i = rosterItems.iterator(); i.hasNext();) {
final IRosterItem item = (IRosterItem) i.next();
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) {
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item;
count += countClientsInRosterGroup(group, oldID);
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) {
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item;
XMPPID entryID = (XMPPID) entry.getUser().getID();
if (!entryID.equals(oldID)
&& entryID.getUsernameAtHost().equals(
oldID.getUsernameAtHost())) {
count++;
}
}
}
}
return count;
}
private void removeItemFromRoster(Collection<Object> rosterItems,
XMPPID itemIDToRemove) {
boolean removed = false;
synchronized (rosterItems) {
for (final Iterator<Object> i = rosterItems.iterator(); i.hasNext();) {
final IRosterItem item = (IRosterItem) i.next();
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) {
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item;
removed = removeItemFromRosterGroup(group, itemIDToRemove);
// If group is empty, remove it too
if (group.getEntries().size() == 0)
i.remove();
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) {
if (((org.eclipse.ecf.presence.roster.RosterEntry) item)
.getUser().getID().equals(itemIDToRemove)) {
i.remove();
removed = true;
}
}
}
}
if (removed)
rosterManager.notifyRosterUpdate(roster);
}
private boolean removeItemFromRosterGroup(
org.eclipse.ecf.presence.roster.RosterGroup group,
XMPPID itemIDToRemove) {
@SuppressWarnings("unchecked")
final Collection<Object> groupEntries = group.getEntries();
synchronized (groupEntries) {
for (final Iterator<Object> i = groupEntries.iterator(); i
.hasNext();) {
final org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) i
.next();
if (entry.getUser().getID().equals(itemIDToRemove)) {
i.remove();
return true;
}
}
}
return false;
}
/**
* provide the VizRosterManager access to the super rosterManager
*
* @return
*/
protected IRosterManager getSuperRosterManager() {
return super.getRosterManager();
}
/**
* Use the viz roster manager instead of super, most calls are just
* forwarded through.
*/
@Override
public IRosterManager getRosterManager() {
return rosterManager;
}
/**
* The entire purpose of this class is to intercept the various listeners so
* that they can be notified when presence changes in the viz
* XMPPCOntainerPresenceHelper since it does not have access to the super
* class roster manager listeners.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 26, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
private class VizRosterManager implements IRosterManager {
private final List<IRosterListener> rosterUpdateListeners = new ArrayList<IRosterListener>();
private final List<IPresenceListener> presenceListeners = new ArrayList<IPresenceListener>();
@Override
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
return getSuperRosterManager().getAdapter(adapter);
}
public void notifyRosterUpdate(IRosterItem entry) {
List<IRosterListener> toNotify = null;
synchronized (rosterUpdateListeners) {
toNotify = new ArrayList<IRosterListener>(rosterUpdateListeners);
}
for (IRosterListener l : toNotify) {
l.handleRosterUpdate(entry.getRoster(), entry);
}
}
public void notifyPresenceListeners(ID fromID, IPresence presence) {
List<IPresenceListener> toNotify = null;
synchronized (presenceListeners) {
toNotify = new ArrayList<IPresenceListener>(presenceListeners);
}
for (IPresenceListener l : toNotify) {
l.handlePresence(fromID, presence);
}
}
@Override
public IRoster getRoster() {
return getSuperRosterManager().getRoster();
}
@Override
public void addRosterListener(IRosterListener listener) {
getSuperRosterManager().addRosterListener(listener);
synchronized (rosterUpdateListeners) {
rosterUpdateListeners.add(listener);
}
}
@Override
public void removeRosterListener(IRosterListener listener) {
getSuperRosterManager().removeRosterListener(listener);
synchronized (rosterUpdateListeners) {
rosterUpdateListeners.remove(listener);
}
}
@Override
public void addRosterSubscriptionListener(
IRosterSubscriptionListener listener) {
getSuperRosterManager().addRosterSubscriptionListener(listener);
}
@Override
public void removeRosterSubscriptionListener(
IRosterSubscriptionListener listener) {
getSuperRosterManager().removeRosterSubscriptionListener(listener);
}
@Override
public IRosterSubscriptionSender getRosterSubscriptionSender() {
return getSuperRosterManager().getRosterSubscriptionSender();
}
@Override
public IPresenceSender getPresenceSender() {
return getSuperRosterManager().getPresenceSender();
}
@Override
public void addPresenceListener(IPresenceListener listener) {
getSuperRosterManager().addPresenceListener(listener);
synchronized (presenceListeners) {
presenceListeners.add(listener);
}
}
@Override
public void removePresenceListener(IPresenceListener listener) {
getSuperRosterManager().removePresenceListener(listener);
synchronized (presenceListeners) {
presenceListeners.remove(listener);
}
}
}
}

View file

@ -0,0 +1,71 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.xmpp.internal.smack;
import java.io.IOException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.provider.comm.IAsynchEventHandler;
import org.eclipse.ecf.provider.xmpp.identity.XMPPRoomID;
import org.jivesoftware.smack.packet.Presence;
/**
* Extends ECFConnection from xmpp provider, adds ability to send presence to a
* room using the roomId.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 20, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@SuppressWarnings("restriction")
public class ECFConnection extends
org.eclipse.ecf.internal.provider.xmpp.smack.ECFConnection {
public ECFConnection(boolean google, Namespace ns, IAsynchEventHandler h) {
super(google, ns, h);
}
@Override
public void sendPresenceUpdate(ID target, Presence presence)
throws IOException {
if (target instanceof XMPPRoomID) {
// sendPresenceUpdate uses target.getName to determine where to send
// the presence to, this does not work for roomId because getName
// will return the room name without the host, so instead of using
// the super version directly we will setTo on the presence here and
// then send no target to super.
presence.setTo(((XMPPRoomID) target).getMucString());
super.sendPresenceUpdate(null, presence);
} else {
super.sendPresenceUpdate(target, presence);
}
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.raytheon.uf.viz.collaboration.comm</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,8 @@
#Fri Feb 24 08:50:10 CST 2012
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6

View file

@ -0,0 +1,35 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Collaboratioin
Bundle-SymbolicName: com.raytheon.uf.viz.collaboration.comm
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.raytheon.uf.viz.collaboration.comm.Activator
Bundle-Vendor: RAYTHEON
Eclipse-RegisterBuddy: com.raytheon.uf.viz.core
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ecf;bundle-version="3.1.300";visibility:=reexport,
org.eclipse.ecf.presence;bundle-version="2.0.0",
org.eclipse.ecf.provider.xmpp;bundle-version="3.2.0",
org.apache.commons.lang;bundle-version="2.3.0",
com.google.guava;bundle-version="1.0.0";visibility:=reexport,
com.raytheon.uf.common.serialization;bundle-version="1.12.1174",
com.raytheon.uf.common.status;bundle-version="1.12.1174",
org.jivesoftware.smack;bundle-version="3.1.100",
org.eclipse.swt;bundle-version="3.6.1",
com.raytheon.uf.common.comm,
com.raytheon.uf.common.localization
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Export-Package: com.raytheon.uf.viz.collaboration.comm,
com.raytheon.uf.viz.collaboration.comm.compression,
com.raytheon.uf.viz.collaboration.comm.identity,
com.raytheon.uf.viz.collaboration.comm.identity.event,
com.raytheon.uf.viz.collaboration.comm.identity.info,
com.raytheon.uf.viz.collaboration.comm.identity.invite,
com.raytheon.uf.viz.collaboration.comm.identity.roster,
com.raytheon.uf.viz.collaboration.comm.identity.user,
com.raytheon.uf.viz.collaboration.comm.provider,
com.raytheon.uf.viz.collaboration.comm.provider.event,
com.raytheon.uf.viz.collaboration.comm.provider.info,
com.raytheon.uf.viz.collaboration.comm.provider.session,
com.raytheon.uf.viz.collaboration.comm.provider.user

View file

@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.

View file

@ -0,0 +1,83 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.raytheon.uf.common.comm.NetworkStatistics;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class Activator implements BundleActivator {
public static final String PEER_TO_PEER = "PeerToPeerMsg";
public static final String VENUE = "VenueMsg";
private static Activator plugin;
private BundleContext context;
private NetworkStatistics networkStats = new NetworkStatistics();
public BundleContext getContext() {
return context;
}
/**
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext bundleContext) throws Exception {
this.context = bundleContext;
plugin = this;
}
/**
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
plugin = null;
context = null;
}
public NetworkStatistics getNetworkStats() {
return networkStats;
}
public static Activator getDefault() {
return plugin;
}
}

View file

@ -0,0 +1,175 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.compression;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.InflaterInputStream;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
/**
* Utilities for compressing or decompressing data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 11, 2012 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class CompressionUtil {
public static CompressionType COMPRESSION_TYPE = CompressionType.ZLIB;
private static boolean log_compression = false;
private enum CompressionType {
ZLIB, GZIP;
public byte toByte() {
return (byte) ordinal();
}
public static CompressionType fromByte(byte b) {
if (b < 0 || b > CompressionType.values().length) {
throw new IndexOutOfBoundsException(
"Unable to determine CompressionType for " + b);
}
return CompressionType.values()[b];
}
};
public static byte[] compress(byte[] bytes) throws CollaborationException {
ByteArrayOutputStream out = new ByteArrayOutputStream(bytes.length);
CompressionType cType = COMPRESSION_TYPE;
out.write(cType.toByte());
OutputStream compressionStrm = null;
try {
compressionStrm = createCompressionOutputStream(out);
long start = System.currentTimeMillis();
compressionStrm.write(bytes);
compressionStrm.flush();
compressionStrm.close();
byte[] result = out.toByteArray();
if (log_compression) {
System.out.println(cType + " Compression time(milliseconds) "
+ (System.currentTimeMillis() - start) / 1000F
+ " to compress " + bytes.length + " bytes to "
+ result.length + " bytes.");
}
return result;
} catch (IOException e) {
throw new CollaborationException("Unable to compress data.", e);
}
}
private static OutputStream createCompressionOutputStream(OutputStream out)
throws IOException {
OutputStream stream = null;
switch (COMPRESSION_TYPE) {
case GZIP:
stream = new GZIPOutputStream(out);
break;
case ZLIB:
default:
Deflater defl = new Deflater(Deflater.BEST_COMPRESSION);
stream = new DeflaterOutputStream(out, defl);
break;
}
return stream;
}
public static byte[] uncompress(byte[] bytes) throws CollaborationException {
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
ByteArrayOutputStream out = new ByteArrayOutputStream();
CompressionType cType = CompressionType.fromByte((byte) in.read());
long start = System.currentTimeMillis();
try {
ReadableByteChannel src = Channels
.newChannel(createCompressionInputStream(cType, in));
WritableByteChannel dest = Channels.newChannel(out);
final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024);
while (src.read(buffer) != -1) {
buffer.flip();
dest.write(buffer);
buffer.compact();
}
// EOF will leave buffer in fill state
buffer.flip();
// make sure the buffer is fully drained.
while (buffer.hasRemaining()) {
dest.write(buffer);
}
dest.close();
byte[] resultBuffer = out.toByteArray();
if (log_compression) {
System.out.println(cType
+ " Uncompression time(milliseconds): "
+ ((System.currentTimeMillis() - start) / 1000F)
+ " to uncompress " + bytes.length + " bytes to "
+ resultBuffer.length + " bytes.");
}
return resultBuffer;
} catch (IOException e) {
throw new CollaborationException("Unable to uncompress data.", e);
}
}
private static InputStream createCompressionInputStream(
CompressionType cType, InputStream in) throws IOException {
InputStream stream = null;
switch (cType) {
case GZIP:
stream = new GZIPInputStream(in);
break;
case ZLIB:
default:
stream = new InflaterInputStream(in);
break;
}
return stream;
}
}

View file

@ -0,0 +1,73 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 8, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class CollaborationException extends Exception {
private static final long serialVersionUID = 2897604473798379699L;
/**
*
*/
public CollaborationException() {
}
/**
* @param message
*/
public CollaborationException(String message) {
super(message);
}
/**
*
* @param message
* @param cause
*/
public CollaborationException(String message, Throwable cause) {
super(message, cause);
}
/**
* @param cause
*/
public CollaborationException(Throwable cause) {
super(cause);
}
}

View file

@ -0,0 +1,130 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import java.util.Map;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.identity.roster.ISubscriptionResponder;
/**
* TODO Add Description
*
*
*
*
* <ul>
* EventBus subscription events.
* <li>ISubscriptionResponseEvent : This event is posted when a subscription
* request has been responded to.</li>
* </ul>
*
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 16, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IAccountManager {
/**
* Set whether the account manager will auto subscribe to subscription
* requests.
*
* @param mode
* The auto subscription mode.
*/
void setAutoSubscriptionMode(boolean mode);
/**
* Get the account manager auto subscription mode.
*
* @return The auto subscription mode.
*/
boolean getAutoSubscriptionMode();
/**
*
* @param responder
*/
void setSubscriptionRequestResponder(ISubscriptionResponder responder);
/**
* Removes the current subscription request responder.
*/
void removeSubscriptionRequestResponder();
/**
*
* @param name
* @param password
* @param attributes
* @throws CollaborationException
*/
void createAccount(String name, char[] password,
Map<String, String> attributes) throws CollaborationException;
/**
* Allows the user to change their account password. If the server does not
* allow this operation an exception will be thrown.
*
* @param password
* @throws CollaborationException
*/
void changePassword(char[] password) throws CollaborationException;
/**
* Allows the user to delete this account on the server. An exception will
* be thrown if the account deletion fails. If the account is currently
* connected, it and any associated objects will be closed followed by the
* account deletion.
*
* @throws CollaborationException
*/
void deleteAccount() throws CollaborationException;
/**
* Can an account be created on the server.
*
* @return Can an account be created on the server?
* @throws CollaborationException
* The query failed.
*/
boolean canCreateAccount() throws CollaborationException;
/**
* Allow the user to send presence information to the transport provider.
*
* @param presence
* @return Return status information.
* @throws CollaborationException
*/
public void sendPresence(IPresence presence) throws CollaborationException;
}

View file

@ -0,0 +1,41 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 19, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ICollaborationMessage extends IMessage {
}

View file

@ -0,0 +1,136 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IMessage extends IPropertied {
public enum MessageType { CHAT, COLLABORATION };
static final String MESSAGE_TYPE = "type";
static final String TIMESTAMP = "timestamp";
/**
* @return the to
*/
IQualifiedID getTo();
/**
* @param to
* the to to set
*/
void setTo(IQualifiedID to);
/**
* @return the from
*/
IQualifiedID getFrom();
/**
* @param from
* the from to set
*/
void setFrom(IQualifiedID from);
/**
* Get the subject of this message.
* @return The subject of this message. The subject may be null.
*/
String getSubject();
/**
* Set the subject of this message. If not set the
* subject is set to null.
* @param subject The subject of this message.
*/
void setSubject(String subject);
/**
*
* @return
*/
MessageType getMessageType();
/**
* Get the body of this message.
* @return The body of this message. The body may be null.
*/
String getBody();
/**
* Set the data to be transmitted in the message. If not set the
* body is set to null.
* @param body The data to be transmitted in the message.
*/
void setBody(String body);
/**
* Returns the body of the message as a byte array.
* @return The body of the message as binary data.
*/
byte [] getBodyAsBinary();
/**
* Set the body of the message as a byte array.
* @param body The binary data to be transmitted in the message.
*/
void getBodyAsBinary(byte [] body);
/**
* Get the status of this message.
* @return The message status.
*/
String getStatus();
/**
* Set the status of this message.
* @param The message status.
*/
void setStatus(String status);
/**
* Get the receipt time for this message in milliseconds from
* Jan 1, 1970.
* @return The receipt time stamp.
*/
long getTimeStamp();
}

View file

@ -0,0 +1,63 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IPeerToPeer extends ISession, IEventPublisher {
/**
* Send a Text message. Note that the recipient of the message is included
* as an attribute of the message.
*
* @param message
*/
void sendPeerToPeer(IMessage message) throws CollaborationException;
/**
* Send a Text message to a specific receiver.
*
* @param to
* The intended receiver.
* @param message
* The message to send.
*/
void sendPeerToPeer(IQualifiedID to, String message)
throws CollaborationException;
}

View file

@ -0,0 +1,153 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import java.util.Collection;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IPropertied {
public static class Property {
private String value;
private String key;
/**
*
* @param key
* @param value
*/
public Property(String key, String value) {
this.key = key;
this.value = value;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
/**
* @return the key
*/
public String getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
@Override
public String toString() {
return String.format("[%s{%s}]", key, value);
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Property other = (Property) obj;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}
/**
*
* @param key
* @param defaultValue
* @return
*/
void setProperty(String key, String value);
/**
*
* @param key
* @param defaultValue
* @return
*/
String getProperty(String key, String defaultValue);
/**
* Gets the message properties as a collection of key, value
* pairs. Always returns a not-null value.
* @return
*/
Collection<Property> getProperties();
}

View file

@ -0,0 +1,96 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher;
import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
*
* Implementations of ISession do not support polling for messages but instead
* make exclusive use of listener based callbacks to make incoming data
* available.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ISession extends IEventPublisher {
/**
* Close and clean up this session. After a close, isConnected must return
* false.
*/
public void close();
/**
*
* @return
*/
public UserId getUserID();
/**
* Gets the connection status of the session.
*
* @return The connection status.
*/
public boolean isConnected();
/**
* Get the session identifier.
*
* @return The session identifier.
*/
public String getSessionId();
public CollaborationConnection getConnection();
}

View file

@ -0,0 +1,133 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
*
*
* <ul>
* <li>EventBus subscription events. Implementors may to post the following
* events.</li>
* <ul>
* <li><strong>IVenueParticipantEvent</strong> : This event is posted when a
* venue participant enters, leaves a venue, or updates their status in the
* venue.</li>
* <li><strong>TextMessage</strong> : Text messages send between users. Meant to
* be displayed as conversation.</li>
* <li><strong>IDisplayEvent</strong> : These messages are CAVE to CAVE events</li>
* <li><strong>IRenderable</strong> : These messages are CAVE to CAVE
* display......</li>
* <li><strong>IInitData</strong> : These messages are CAVE to CAVE
* initialization data......</li>
* <li><strong>IDisplayEvent</strong> : These messages are CAVE to CAVE
* display......</li>
*
* </ul>
* </ul>
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ISharedDisplaySession extends IVenueSession {
/**
* Sends the object to the other collaborators on the session. The object
* must be serializable and once received by the others, will be posted to
* the session's event bus.
*
* @param obj
* the serializable object to send
* @throws CollaborationException
*/
public void sendObjectToVenue(Object obj) throws CollaborationException;
/**
* Sends the object to a specific collaborator on the session. The object
* must be serializable and once received by the other, will be posted to
* the session's event bus.
*
* @param id
* the id of the collaborator to send to
* @param obj
* the serializable object to send
* @throws CollaborationException
*/
public void sendObjectToPeer(IQualifiedID id, Object obj)
throws CollaborationException;
/**
* Returns the current Data Provider for the session
*
* @return
*/
public UserId getCurrentDataProvider();
/**
* Returns the current Session Leader for the session
*
* @return
*/
public UserId getCurrentSessionLeader();
/**
* Sets the current Data Provider for the session
*
* @param participant
*/
public void setCurrentDataProvider(UserId participant);
/**
* Sets the current Session Leader for the session
*
* @param participant
*/
public void setCurrentSessionLeader(UserId participant);
/**
* Checks if the currently logged in user has the role on this session
*
* @param role
* @return
*/
public boolean hasRole(SharedDisplayRole role);
/**
* Gets the connection status of the session.
*
* @return The connection status.
*/
public boolean isConnected();
}

View file

@ -0,0 +1,41 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 19, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueMessage extends IMessage {
}

View file

@ -0,0 +1,109 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
import java.util.List;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenue;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.VenueInvite;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
*
*
* <ul>
* <li>EventBus subscription events. Implementors are required to post the
* following events.</li>
* <ul>
* <li><strong>IVenueParticipantEvent</strong> : This event is posted when a
* venue participant enters, leaves a venue, or updates their status in the
* venue.</li>
* <li><strong>TextMessage</strong> : Text messages send between users. Meant to
* be displayed as conversation.</li>
* <li><strong>CollaborationMessage</strong> : These messages are CAVE to CAVE
* command messages.</li>
* </ul>
* </ul>
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 5, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueSession extends ISession {
/**
* Returns information about a venue.
*
* @return Information about a venue
*/
public IVenue getVenue();
/**
* Send a chat message.
*
* @param message
* The message to send.
*/
public void sendChatMessage(String message) throws CollaborationException;
/**
* Send an invitation from this venue to another user.
*
* @param id
* The target user for this invitation.
* @param subject
* The intended subject of the venue conversation.
* @return
*/
public void sendInvitation(UserId id, VenueInvite invite)
throws CollaborationException;
/**
* Send an invitation from this venue to a list of users.
*
* @param ids
* A list of target users for this invitation.
* @param body
* Any text that the user may wish to include.
* @return
*/
public void sendInvitation(List<UserId> ids, VenueInvite invite)
throws CollaborationException;
/**
* Send presence to a venue.
*
* @param presence
*/
public void sendPresence(IPresence presence) throws CollaborationException;
}

View file

@ -0,0 +1,51 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
/**
* If a user is logged in one CAVE and tries to login from another this
* exception gets thrown as that is not supported.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 9, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
public class MultipleLoginException extends CollaborationException {
private static final long serialVersionUID = 3124620509180835631L;
/**
* @param message
* @param cause
*/
public MultipleLoginException(String message, Throwable cause) {
super(message, cause);
}
}

View file

@ -0,0 +1,51 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 15, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
public class UsernamePasswordException extends CollaborationException {
private static final long serialVersionUID = 3124620509180835631L;
/**
* @param message
* @param cause
*/
public UsernamePasswordException(String message, Throwable cause) {
super(message, cause);
}
}

View file

@ -0,0 +1,47 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
* Jun 12, 2012 njensen Improved
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IEventPublisher {
public void registerEventHandler(Object handler);
public void unregisterEventHandler(Object handler);
public void postEvent(Object event);
}

View file

@ -0,0 +1,47 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 11, 2012 bkowal Initial creation
*
* </pre>
*
* @author bkowal
* @version 1.0
*/
public interface IHttpdCollaborationConfigurationEvent {
/**
*
* @return the url used to connect to the collaboration
* httpd server.
*/
String getHttpdCollaborationURL();
}

View file

@ -0,0 +1,68 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import java.util.regex.Pattern;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
/**
* Used to store constants that are used to validate, analyze, and parse status
* and configuration messages associated with the AWIPS II httpd collaboration
* server.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 7, 2012 bkowal Initial creation
*
* </pre>
*
* @author bkowal
* @version 1.0
*/
public interface IHttpdXmppMessage {
// Constant Strings
public static final String URL_PARAMETER_NAME = "sessionDataHttpURL";
public static final String ERROR_PARAMETER_NAME = "error";
// Regex
static final String PREABMLE_REGEX = Tools.CONFIG_PREAMBLE.replace("[",
"\\[");
static final String SUFFIX_REGEX = " : .+" + Tools.DIRECTIVE_SUFFIX;
static final String COLLABORATION_URL_REGEX = "http://.+:[1-9][0-9]*/session_data/";
// Regex Patterns
public static final Pattern configErrorPattern = Pattern
.compile(PREABMLE_REGEX + ERROR_PARAMETER_NAME + SUFFIX_REGEX);
public static final Pattern configURLPattern = Pattern
.compile(PREABMLE_REGEX + URL_PARAMETER_NAME + SUFFIX_REGEX);
public static final Pattern urlPattern = Pattern
.compile(COLLABORATION_URL_REGEX);
}

View file

@ -0,0 +1,57 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import org.eclipse.ecf.presence.roster.IRosterItem;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 6, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IRosterChangeEvent {
/**
* Get the event type.
*
* @return The event type.
*/
RosterChangeType getType();
/**
* Get the changed entry
*
* @return The changed entry.
*/
IRosterItem getItem();
}

View file

@ -0,0 +1,57 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import org.eclipse.ecf.presence.IPresence;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 16, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ISubscriptionResponseEvent {
/**
* How was the subscription responded to.
*
* @return The response type.
*/
IPresence.Type getResponse();
/**
* Was this response due to an auto responder.
*
* @return Was this response due to an auto responder.
*/
boolean isAutoResponder();
}

View file

@ -0,0 +1,49 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ITextMessageEvent {
/**
*
* @return
*
*/
TextMessage getMessage();
}

View file

@ -0,0 +1,62 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.VenueInvite;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* Encapsulates a venue invitation to the user.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueInvitationEvent {
/**
*
* @return
*/
IQualifiedID getRoomId();
/**
*
* @return
*/
IQualifiedID getInviter();
/**
*
*/
String getSubject();
public VenueInvite getInvite();
}

View file

@ -0,0 +1,62 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 20, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueParticipantEvent {
/**
*
* @return
*/
ParticipantEventType getEventType();
/**
*
* @return
*/
UserId getParticipant();
/**
*
* @return
*/
IPresence getPresence();
}

View file

@ -0,0 +1,41 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 20, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public enum ParticipantEventType {
ARRIVED, DEPARTED, UPDATED, PRESENCE_UPDATED;
}

View file

@ -0,0 +1,41 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 11, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public enum RosterChangeType {
ADD, DELETE, MODIFY, PRESENCE
}

View file

@ -0,0 +1,69 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.info;
import java.util.Collection;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* Provides information about a venue. In addition implementations will act as a
* target for participant updates such as
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 1, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenue {
/**
*
* @return
*/
public IVenueInfo getInfo();
/**
*
* @return
*/
public Collection<UserId> getParticipants();
/**
* Get the presence for a user in the session.
*
* @param user
* @return
*/
public IPresence getPresence(IUser user);
}

View file

@ -0,0 +1,91 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.info;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 1, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueInfo {
/**
*
* @return
*/
String getVenueDescription();
/**
* Get a long name for venue
*
* @return
*/
String getVenueName();
/**
*
* @return
*/
String getVenueSubject();
/**
*
* @return
*/
String getVenueID();
/**
* Get a count of the current number of room participants
*
* @return Count of the current number of room participants
*/
int getParticipantCount();
/**
*
* @return
*/
boolean isModerated();
/**
*
* @return
*/
boolean isPersistent();
/**
*
* @return
*/
boolean requiresPassword();
}

View file

@ -0,0 +1,187 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.info;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 12, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class SiteConfigInformation {
public static final String ROLE_NAME = "Role";
public static final String SITE_NAME = "Site";
@XmlElement
private List<HostConfig> server;
@XmlElement
private List<SiteConfig> config;
/**
* @return the hosts
*/
public List<HostConfig> getServer() {
return server;
}
/**
* @param hosts
* the hosts to set
*/
public void setServer(List<HostConfig> server) {
this.server = server;
}
/**
* @return the infos
*/
public List<SiteConfig> getConfig() {
return config;
}
/**
* @param infos
* the infos to set
*/
public void setConfig(List<SiteConfig> config) {
this.config = config;
}
@XmlAccessorType(XmlAccessType.NONE)
public static class HostConfig {
@XmlAttribute
private String hostname;
@XmlAttribute
private String prettyName;
/**
* @return the hostname
*/
public String getHostname() {
return hostname;
}
/**
* @param hostname
* the hostname to set
*/
public void setHostname(String hostname) {
this.hostname = hostname;
}
/**
* @return the prettyName
*/
public String getPrettyName() {
return prettyName;
}
/**
* @param prettyName
* the prettyName to set
*/
public void setPrettyName(String prettyName) {
this.prettyName = prettyName;
}
}
@XmlAccessorType(XmlAccessType.NONE)
public static class SiteConfig {
@XmlAttribute
private String site;
@XmlElement
private String[] subscribedSites;
@XmlElement
private String[] roles;
/**
* @return the site
*/
public String getSite() {
return site;
}
/**
* @param site
* the site to set
*/
public void setSite(String site) {
this.site = site;
}
/**
* @return the subscribedSites
*/
public String[] getSubscribedSites() {
return subscribedSites;
}
/**
* @param subscribedSites
* the subscribedSites to set
*/
public void setSubscribedSites(String[] subscribedSites) {
this.subscribedSites = subscribedSites;
}
/**
* @return the role
*/
public String[] getRoles() {
return roles;
}
/**
* @param role
* the role to set
*/
public void setRoles(String[] roles) {
this.roles = roles;
}
}
}

View file

@ -0,0 +1,148 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.invite;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 19, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
@DynamicSerialize
public class ColorPopulator {
@DynamicSerializeElement
private List<UserId> userName;
@DynamicSerializeElement
private List<Integer> red;
@DynamicSerializeElement
private List<Integer> green;
@DynamicSerializeElement
private List<Integer> blue;
public ColorPopulator() {
}
public ColorPopulator(Map<UserId, RGB> rgbs) {
userName = new ArrayList<UserId>();
red = new ArrayList<Integer>();
green = new ArrayList<Integer>();
blue = new ArrayList<Integer>();
for (UserId key : rgbs.keySet()) {
userName.add(key);
red.add(rgbs.get(key).red);
green.add(rgbs.get(key).green);
blue.add(rgbs.get(key).blue);
}
}
public Map<UserId, RGB> getColors() {
Map<UserId, RGB> colors = new HashMap<UserId, RGB>();
for (int i = 0; i < userName.size(); i++) {
colors.put(userName.get(i),
new RGB(red.get(i), green.get(i), blue.get(i)));
}
return colors;
}
/**
* @return the userName
*/
public List<UserId> getUserName() {
return userName;
}
/**
* @param userName
* the userName to set
*/
public void setUserName(List<UserId> userName) {
this.userName = userName;
}
/**
* @return the red
*/
public List<Integer> getRed() {
return red;
}
/**
* @param red
* the red to set
*/
public void setRed(List<Integer> red) {
this.red = red;
}
/**
* @return the green
*/
public List<Integer> getGreen() {
return green;
}
/**
* @param green
* the green to set
*/
public void setGreen(List<Integer> green) {
this.green = green;
}
/**
* @return the blue
*/
public List<Integer> getBlue() {
return blue;
}
/**
* @param blue
* the blue to set
*/
public void setBlue(List<Integer> blue) {
this.blue = blue;
}
}

View file

@ -0,0 +1,68 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.invite;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 19, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
@DynamicSerialize
public class SharedDisplayVenueInvite extends VenueInvite {
@DynamicSerializeElement
private UserId sessionLeader;
@DynamicSerializeElement
private UserId dataProvider;
public UserId getSessionLeader() {
return sessionLeader;
}
public void setSessionLeader(UserId sessionLeader) {
this.sessionLeader = sessionLeader;
}
public UserId getDataProvider() {
return dataProvider;
}
public void setDataProvider(UserId dataProvider) {
this.dataProvider = dataProvider;
}
}

View file

@ -0,0 +1,77 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.invite;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* An invite message for inviting another user to a venue.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 10, 2012 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
@DynamicSerialize
public class VenueInvite {
@DynamicSerializeElement
private String subject;
@DynamicSerializeElement
private String message;
@DynamicSerializeElement
private String sessionId;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
}

View file

@ -0,0 +1,64 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.roster;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 16, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ISubscriptionResponder {
/**
*
* @param fromID
* @return The response that should be returned to the subscriber.
*/
IPresence.Type handleSubscribeRequest(IQualifiedID fromID);
/**
*
* @param fromID
*/
void handleSubscribed(IQualifiedID fromID);
/**
*
* @param fromID
*/
void handleUnsubscribed(IQualifiedID fromID);
}

View file

@ -0,0 +1,58 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.user;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface ID {
/**
*
* @param userName
*/
void setName(String userName);
/**
*
*/
String getName();
/**
*
* @return
*/
String getFQName();
}

View file

@ -0,0 +1,65 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.user;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IQualifiedID extends ID {
/**
*
* @param hostName
*/
void setHost(String hostName);
/**
*
* @return
*/
String getHost();
/**
*
* @param resource
*/
void setResource(String resource);
/**
*
* @return
*/
String getResource();
}

View file

@ -0,0 +1,43 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.user;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 29, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public interface IVenueId extends IQualifiedID {
String getVenueName();
}

View file

@ -0,0 +1,41 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.identity.user;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 22, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public enum SharedDisplayRole {
DATA_PROVIDER, SESSION_LEADER, PARTICIPANT;
}

View file

@ -0,0 +1,251 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.raytheon.uf.viz.collaboration.comm.identity.IMessage;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public abstract class BaseMessage implements Serializable, IMessage {
private static final long serialVersionUID = 1L;
private Map<String, String> properties = null;
private String body;
private IQualifiedID to;
private IQualifiedID from;
private String subject;
private String status;
private long timeStamp;
/**
*
* @param to
* @param body
*/
protected BaseMessage(IQualifiedID to, String body) {
this.body = body;
this.to = to;
initProperties();
timeStamp = setCurrentTimeStamp();
}
/**
* @return the to
*/
@Override
public IQualifiedID getTo() {
return to;
}
/**
* @param to
* the to to set
*/
@Override
public void setTo(IQualifiedID to) {
this.to = to;
}
/**
* @return the from
*/
@Override
public IQualifiedID getFrom() {
return from;
}
/**
* @param from
* the from to set
*/
@Override
public void setFrom(IQualifiedID from) {
this.from = from;
}
/**
* @param body
* the body to set
*/
@Override
public void setBody(String body) {
this.body = body;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getBody()
*/
@Override
public String getBody() {
return body;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getBodyAsBinary()
*/
@Override
public byte[] getBodyAsBinary() {
return null;
}
/**
*
*/
private void initProperties() {
if (properties == null) {
properties = new HashMap<String, String>();
}
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#setProperty(java.lang.String,
* java.lang.String)
*/
@Override
public void setProperty(String key, String value) {
properties.put(key, value);
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getProperty(java.lang.String,
* java.lang.String)
*/
@Override
public String getProperty(String key, String defaultValue) {
String retValue = defaultValue;
if (properties != null) {
if (properties.containsKey(key)) {
retValue = properties.get(key);
}
}
return retValue;
}
/**
* Gets the message properties as a collection of key, value pairs. Always
* returns a not-null value.
*
* @return A Collection of properties associated with this message.
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getProperties()
*/
@Override
public Collection<Property> getProperties() {
Collection<Property> p = new ArrayList<Property>();
for (String s : properties.keySet()) {
p.add(new Property(s, properties.get(s)));
}
return p;
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getSubject()
*/
@Override
public String getSubject() {
return subject;
}
/**
*
* @param subject
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#setSubject(java.lang.String)
*/
@Override
public void setSubject(String subject) {
this.subject = subject;
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getStatus()
*/
@Override
public String getStatus() {
return status;
}
/**
*
* @param status
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#setStatus(java.lang.String)
*/
@Override
public void setStatus(String status) {
this.status = status;
}
/**
* Get the receipt time for this message in milliseconds from Jan 1, 1970.
*
* @return The receipt time stamp.
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getTimeStamp()
*/
@Override
public long getTimeStamp() {
return timeStamp;
}
/**
*
* @return
*/
public void setTimeStamp(long timeStamp) {
this.timeStamp = timeStamp;
}
private long setCurrentTimeStamp() {
long timestamp = System.currentTimeMillis();
properties.put(TIMESTAMP, Long.toHexString(timestamp));
return timestamp;
}
}

View file

@ -0,0 +1,71 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class CollaborationMessage extends BaseMessage {
private static final long serialVersionUID = 1L;
/**
*
* @param to
* @param body
*/
public CollaborationMessage(IQualifiedID to, String body) {
super(to, body);
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getMessageType()
*/
@Override
public MessageType getMessageType() {
return MessageType.COLLABORATION;
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IMessage#getBodyAsBinary(byte[])
*/
@Override
public void getBodyAsBinary(byte[] body) {
}
}

View file

@ -0,0 +1,74 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
/**
*
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 23, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public enum SerializationMode {
THRIFT, JAXB, JAVA, STRING, NONE, ISNULL;
public static SerializationMode getMode(Object object) {
SerializationMode mode = ISNULL;
if (object != null) {
if (object instanceof String) {
mode = STRING;
} else if (object instanceof Serializable) {
mode = JAVA;
} else {
// We may override the serialization type
Class<?> clazz = object.getClass();
Annotation a = clazz.getAnnotation(DynamicSerialize.class);
if (a != null) {
mode = THRIFT;
} else {
a = clazz.getAnnotation(XmlRootElement.class);
if (a != null) {
mode = JAXB;
} else {
mode = NONE;
}
}
}
}
return mode;
}
}

View file

@ -0,0 +1,66 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class TextMessage extends BaseMessage {
private static final long serialVersionUID = 1L;
/**
*
* @param to
* @param body
*/
public TextMessage(IQualifiedID to, String body) {
super(to, body);
}
/**
*
*/
@Override
public MessageType getMessageType() {
return MessageType.CHAT;
}
@Override
public void getBodyAsBinary(byte[] body) {
}
}

View file

@ -0,0 +1,389 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import javax.xml.bind.JAXBException;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.util.Base64;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.viz.collaboration.comm.compression.CompressionUtil;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 7, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public abstract class Tools {
public static final String TAG_INVITE = "[[INVITEID#";
public static final String TAG_INVITE_ID = TAG_INVITE + "%s]]%s";
public static final String PROP_SESSION_ID = "sessionId";
public static final String CMD_PREAMBLE = "[[COMMAND#";
public static final String CONFIG_PREAMBLE = "[[CONFIG#";
public static final String DIRECTIVE_SUFFIX = "]]";
private static final String ENV_THRIFT = CMD_PREAMBLE
+ SerializationMode.THRIFT.name() + "]]";
private static final String ENV_THRIFT_COMPRESSED = CMD_PREAMBLE
+ SerializationMode.THRIFT.name() + "-COMPRESSED]]";
private static final String ENV_JAXB = CMD_PREAMBLE
+ SerializationMode.JAXB.name() + "]]";
private static final String ENV_JAXB_COMPRESSED = CMD_PREAMBLE
+ SerializationMode.JAXB.name() + "-COMPRESSED]]";
private static final String ENV_STRING = CMD_PREAMBLE
+ SerializationMode.STRING.name() + "]]";
private static final String ENV_JAVA = CMD_PREAMBLE
+ SerializationMode.JAVA.name() + "]]";
private static final String ENV_NONE = CMD_PREAMBLE
+ SerializationMode.NONE.name() + "]]";
public static final String VENUE_SUBJECT_PROP = "subject";
public static final String NAME_DELIM = "@";
public static final String PORT_DELIM = ":";
public static final String RESOURCE_DELIM = "/";
public static boolean COMPRESSION_OFF = false;
static {
try {
COMPRESSION_OFF = Boolean
.getBoolean("collaboration.compressionOff");
} catch (Exception e) {
// must not have permission to access system properties. ignore and
// use default.
}
}
/**
*
* @param <T>
* @param container
* @param c
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getPresenceContainerAdapter(IContainer container,
Class<T> c) {
return (T) container.getAdapter(c);
}
/**
*
* @param id
* @return
*/
public static String parseName(String id) {
String name = null;
if (id != null) {
int delimPos = id.indexOf(NAME_DELIM);
if (delimPos >= 0) {
name = id.substring(0, delimPos);
}
}
return name;
}
/**
*
* @param id
* @return
*/
public static String parseHost(String id) {
String host = null;
if (id != null) {
int delimPos = id.indexOf(NAME_DELIM);
if (delimPos >= 0) {
// Ok we have the start of the host name
int start = delimPos + 1;
int stop = start;
delimPos = id.indexOf(PORT_DELIM);
if (delimPos > stop) {
// ok we have a port so grab anything in between
stop = delimPos;
} else {
// no port delimiter, so check for the resource
delimPos = id.indexOf(RESOURCE_DELIM);
if (delimPos > stop) {
// we have the resource delimiter
stop = delimPos;
} else {
stop = id.length();
}
}
host = id.substring(start, stop);
}
}
return host;
}
/**
*
* @param id
* @return
*/
public static String parsePort(String id) {
String host = null;
if (id != null) {
int delimPos = id.indexOf(NAME_DELIM);
if (delimPos >= 0) {
// Ok we have the start of the host name
int start = delimPos + 1;
int stop = start;
delimPos = id.indexOf(PORT_DELIM);
if (delimPos > stop) {
// ok we have a port so grab anything in between
start = delimPos + 1;
delimPos = id.indexOf(RESOURCE_DELIM);
if (delimPos > start) {
stop = delimPos;
} else {
stop = id.length();
}
host = id.substring(start, stop);
}
}
}
return host;
}
/**
*
* @param id
* @return
*/
public static String parseResource(String id) {
String resource = null;
if (id != null) {
int delimPos = id.indexOf(NAME_DELIM);
// Ensure that the name delimiter is there first.
if (delimPos >= 0) {
int start = delimPos + 1;
delimPos = id.indexOf(RESOURCE_DELIM);
if (delimPos > start) {
delimPos++;
if (delimPos < id.length()) {
resource = id.substring(delimPos);
}
}
}
}
return resource;
}
/**
* Decode Base64 encoded String data into a byte array.
*
* @param message
* @return The decoded byte array data.
*/
public static byte[] decodeFromBase64(String message) {
return Base64.decode(message);
}
/**
* Encode byte array data into a Base64 String for transmission.
*
* @param message
* The message to encode.
* @return The encoded data as a String.
*/
public static String encodeToBase64(byte[] message) {
return Base64.encode(message);
}
/**
*
* @param data
* @return
*/
public static String marshallData(Object data)
throws CollaborationException {
String marshalledData = null;
if (data != null) {
StringBuilder sb = new StringBuilder();
byte[] marshalledBinary = null;
SerializationMode mode = SerializationMode.getMode(data);
switch (mode) {
case THRIFT: {
try {
if (COMPRESSION_OFF) {
marshalledBinary = SerializationUtil
.transformToThrift(data);
sb.append(ENV_THRIFT);
} else {
/*
* compress(thrift(data))
*/
byte[] marshalledThrift = SerializationUtil
.transformToThrift(data);
marshalledBinary = CompressionUtil
.compress(marshalledThrift);
sb.append(ENV_THRIFT_COMPRESSED);
}
} catch (Exception e) {
throw new CollaborationException(
"[THRIFT] Could not serialize object", e);
}
break;
}
case JAXB: {
try {
if (COMPRESSION_OFF) {
String s = SerializationUtil.marshalToXml(data);
if (s != null) {
sb.append(ENV_JAXB);
sb.append(s);
}
} else {
String rawString = SerializationUtil.marshalToXml(data);
marshalledBinary = CompressionUtil.compress(rawString
.getBytes());
sb.append(ENV_JAXB_COMPRESSED);
}
} catch (Exception je) {
throw new CollaborationException(
"[JAXB] Could not serialize object", je);
}
break;
}
case JAVA: {
break;
}
case STRING: {
sb.append(ENV_STRING);
sb.append(data);
break;
}
case NONE: {
throw new CollaborationException("Serialization of "
+ data.getClass().getName() + " not supported");
}
case ISNULL: {
break;
}
}
if (marshalledBinary != null) {
sb.append(encodeToBase64(marshalledBinary));
}
if (sb.length() > 0) {
marshalledData = sb.toString();
}
}
return marshalledData;
}
/**
*
* @param data
* @return
* @throws CollaborationException
*/
public static Object unMarshallData(String data)
throws CollaborationException {
Object unMarshalledData = null;
if (data != null) {
// look for the envelope header first
if (data.startsWith(ENV_THRIFT)) {
String s = data.substring(ENV_THRIFT.length());
try {
byte[] b = decodeFromBase64(s);
unMarshalledData = SerializationUtil.transformFromThrift(b);
} catch (SerializationException e) {
throw new CollaborationException(
"Could not deserialize object", e);
}
} else if (data.startsWith(ENV_THRIFT_COMPRESSED)) {
String s = data.substring(ENV_THRIFT_COMPRESSED.length());
try {
byte[] rawBytes = decodeFromBase64(s);
byte[] uncompressedBytes = CompressionUtil
.uncompress(rawBytes);
unMarshalledData = SerializationUtil
.transformFromThrift(uncompressedBytes);
// unMarshalledData = SerializationUtil
// .transformFromThrift(createCompressionInputStream(rawBytes));
} catch (Exception e) {
throw new CollaborationException(
"Could not deserialize object", e);
}
} else if (data.startsWith(ENV_JAXB)) {
String s = data.substring(ENV_JAXB.length());
try {
unMarshalledData = SerializationUtil.unmarshalFromXml(s);
} catch (JAXBException je) {
throw new CollaborationException(
"[JAXB] Could not deserialize object", je);
}
} else if (data.startsWith(ENV_JAXB_COMPRESSED)) {
String rawString = data.substring(ENV_JAXB_COMPRESSED.length());
try {
byte[] rawBytes = decodeFromBase64(rawString);
unMarshalledData = SerializationUtil
.unmarshalFromXml(new String(CompressionUtil
.uncompress(rawBytes)));
// unMarshalledData = SerializationUtil
// .unmarshalFromXml(createCompressionInputStream(rawBytes));
} catch (Exception je) {
throw new CollaborationException(
"[JAXB] Could not deserialize object", je);
}
} else if (data.startsWith(ENV_STRING)) {
unMarshalledData = data.substring(ENV_STRING.length());
} else if (data.startsWith(ENV_JAVA)) {
throw new CollaborationException("Could not deserialize object");
} else if (data.startsWith(ENV_NONE)) {
throw new CollaborationException("Could not deserialize object");
}
}
return unMarshalledData;
}
}

View file

@ -0,0 +1,69 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* A command to transfer a role to a different user on the session.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 5, 2012 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
@DynamicSerialize
public class TransferRoleCommand {
@DynamicSerializeElement
private SharedDisplayRole role;
@DynamicSerializeElement
private UserId user;
public SharedDisplayRole getRole() {
return role;
}
public void setRole(SharedDisplayRole role) {
this.role = role;
}
public UserId getUser() {
return user;
}
public void setUser(UserId user) {
this.user = user;
}
}

View file

@ -0,0 +1,62 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import com.raytheon.uf.viz.collaboration.comm.identity.event.ITextMessageEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class ChatMessageEvent implements ITextMessageEvent {
private final TextMessage message;
/**
*
* @param msg
*/
public ChatMessageEvent(TextMessage msg) {
message = msg;
}
/**
*
* @return
*
*/
public TextMessage getMessage() {
return message;
}
}

View file

@ -0,0 +1,57 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IHttpdCollaborationConfigurationEvent;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 11, 2012 bkowal Initial creation
*
* </pre>
*
* @author bkowal
* @version 1.0
*/
public class HttpdCollaborationConfigurationEvent implements
IHttpdCollaborationConfigurationEvent {
private final String httpdCollaborationURL;
/**
*
*/
public HttpdCollaborationConfigurationEvent(String httpdCollaborationURL) {
this.httpdCollaborationURL = httpdCollaborationURL;
}
@Override
public String getHttpdCollaborationURL() {
return this.httpdCollaborationURL;
}
}

View file

@ -0,0 +1,85 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import org.eclipse.ecf.presence.roster.IRosterItem;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.RosterChangeType;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 11, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class RosterChangeEvent implements IRosterChangeEvent {
private final RosterChangeType type;
private final IRosterItem item;
/**
* Create an instance of this event using the given type and entry.
*
* @param type
* The event type.
* @param entry
* The changed entry.
*/
public RosterChangeEvent(RosterChangeType type, IRosterItem item) {
this.type = type;
this.item = item;
}
/**
* Get the event type.
*
* @return The event type.
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent#getType()
*/
@Override
public RosterChangeType getType() {
return type;
}
/**
* Get the changed entry
*
* @return The changed entry.
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent#getEntry()
*/
@Override
public IRosterItem getItem() {
return item;
}
}

View file

@ -0,0 +1,62 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import org.eclipse.ecf.core.user.IUser;
/**
* An event to put on a CollaborationConnection event bus when a users nickname
* has changed to notify all views within this CAVE instance that they need to
* refresh the displays for that user.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 25, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class UserNicknameChangedEvent {
public final IUser user;
public final String nickname;
public UserNicknameChangedEvent(IUser user, String nickname) {
this.user = user;
this.nickname = nickname;
}
public IUser getUser() {
return user;
}
public String getNickname() {
return nickname;
}
}

View file

@ -0,0 +1,54 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import org.eclipse.ecf.presence.IPresence;
/**
* Event that is posted when the local uses changes properties of the presence.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 25, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class UserPresenceChangedEvent {
private final IPresence newPresence;
public UserPresenceChangedEvent(IPresence newPresence) {
super();
this.newPresence = newPresence;
}
public IPresence getNewPresence() {
return newPresence;
}
}

View file

@ -0,0 +1,98 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.VenueInvite;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class VenueInvitationEvent implements IVenueInvitationEvent {
private IQualifiedID venueId;
private IQualifiedID invitor;
private String subject;
private VenueInvite invite;
/**
*
* @param roomId
* @param invitor
* @param subject
* @param body
*/
public VenueInvitationEvent(IQualifiedID venueId, IQualifiedID invitor,
String subject, VenueInvite invite) {
this.venueId = venueId;
this.invitor = invitor;
this.subject = subject;
this.invite = invite;
}
/**
* Get the room identifier
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent#getRoomId()
*/
@Override
public IQualifiedID getRoomId() {
return venueId;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent#getInviter()
*/
@Override
public IQualifiedID getInviter() {
return invitor;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent#getSubject()
*/
@Override
public String getSubject() {
return subject;
}
public VenueInvite getInvite() {
return invite;
}
}

View file

@ -0,0 +1,90 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import org.eclipse.ecf.presence.IPresence;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.ParticipantEventType;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 20, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class VenueParticipantEvent implements IVenueParticipantEvent {
private final ParticipantEventType eventType;
private final UserId participant;
private IPresence presence;
public VenueParticipantEvent(UserId participant,
ParticipantEventType eventType) {
this.participant = participant;
this.eventType = eventType;
}
public VenueParticipantEvent(UserId participant, IPresence presence,
ParticipantEventType eventType) {
this.participant = participant;
this.eventType = eventType;
this.presence = presence;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEvent#getEventType()
*/
@Override
public ParticipantEventType getEventType() {
return eventType;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEvent#getParticipant()
*/
@Override
public UserId getParticipant() {
return participant;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEvent#getPresence()
*/
@Override
public IPresence getPresence() {
return presence;
}
}

View file

@ -0,0 +1,99 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.info;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresence.Type;
import org.eclipse.ecf.presence.Presence;
import org.eclipse.ecf.presence.chatroom.IChatRoomContainer;
import org.eclipse.ecf.presence.chatroom.IChatRoomInfo;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenue;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenueInfo;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 1, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class Venue implements IVenue {
private final IChatRoomContainer container;
private final IVenueInfo info;
private Map<String, IPresence> presenceMap = new HashMap<String, IPresence>();;
public Venue(IChatRoomContainer container, IChatRoomInfo info) {
this.container = container;
this.info = new VenueInfo(info);
}
@Override
public IVenueInfo getInfo() {
return info;
}
@Override
public Collection<UserId> getParticipants() {
Set<UserId> participants = new HashSet<UserId>();
ID[] ids = container.getChatRoomParticipants();
for (ID id : ids) {
participants.add(IDConverter.convertFrom(id));
}
return participants;
}
@Override
public IPresence getPresence(IUser user) {
IPresence presence = presenceMap.get(user.getID().getName());
if (presence == null) {
presence = new Presence(Type.UNAVAILABLE);
}
return presence;
}
public void handlePresenceUpdated(ID fromID, IPresence presence) {
presenceMap.put(fromID.getName(), presence);
}
}

View file

@ -0,0 +1,104 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.info;
import org.eclipse.ecf.presence.chatroom.IChatRoomInfo;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenueInfo;
/**
*
* Wrap a chatroom info in a VenueInfo
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 24, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class VenueInfo implements IVenueInfo {
private IChatRoomInfo info;
public VenueInfo(IChatRoomInfo info) {
this.info = info;
}
@Override
public String getVenueDescription() {
return info.getDescription();
}
@Override
public String getVenueName() {
return info.getName();
}
@Override
public String getVenueSubject() {
return info.getSubject();
}
@Override
public String getVenueID() {
return info.getRoomID().toExternalForm();
}
@Override
public int getParticipantCount() {
return info.getParticipantsCount();
}
@Override
public boolean isModerated() {
return info.isModerated();
}
@Override
public boolean isPersistent() {
return info.isPersistent();
}
@Override
public boolean requiresPassword() {
return info.requiresPassword();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("[%s]:", getVenueName()));
sb.append(String.format("[%s]:", getVenueID()));
sb.append(String.format("mod[%s]:", (isModerated()) ? "T" : "F"));
sb.append(String.format("pers[%s]:", (isPersistent()) ? "T" : "F"));
sb.append(String.format("pass[%s]:", (requiresPassword()) ? "T" : "F"));
sb.append(String.format("\n subject : %s", getVenueSubject()));
sb.append(String.format("\n description : %s", getVenueDescription()));
return sb.toString();
}
}

View file

@ -0,0 +1,310 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.Arrays;
import java.util.Map;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.IPresenceSender;
import org.eclipse.ecf.presence.Presence;
import org.eclipse.ecf.presence.roster.IRosterManager;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionListener;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager;
import com.raytheon.uf.viz.collaboration.comm.identity.ISession;
import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession;
import com.raytheon.uf.viz.collaboration.comm.identity.roster.ISubscriptionResponder;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.provider.event.UserPresenceChangedEvent;
/**
* TODO Add Description
*
* <ul>
* EventBus subscription events.
* <li>ISubscriptionResponseEvent : This event is posted when a subscription
* request has been responded to.</li>
* </ul>
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 16, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class AccountManager implements IAccountManager {
private IRosterSubscriptionListener autoResponder = new IRosterSubscriptionListener() {
@Override
public void handleSubscribeRequest(ID fromID) {
IQualifiedID fromId = null;
IPresence.Type subscribedType = IPresence.Type.UNKNOWN;
if (responder != null) {
subscribedType = responder.handleSubscribeRequest(fromId);
} else {
subscribedType = IPresence.Type.SUBSCRIBED;
}
IPresence presence = new Presence(subscribedType, null,
IPresence.Mode.AVAILABLE);
try {
sendPresence(fromID, presence);
} catch (CollaborationException e) {
e.printStackTrace();
}
}
@Override
public void handleSubscribed(ID fromID) {
System.out.println("AccountManager.handleSubscribed " + fromID);
}
@Override
public void handleUnsubscribed(ID fromID) {
System.out.println("AccountManager.handleUnSubscribed " + fromID);
}
};
private boolean autoRespond = true;
private IPresenceContainerAdapter presenceAdapter;
private ISubscriptionResponder responder;
private CollaborationConnection sessionManager = null;
/**
*
* @param adapter
*/
AccountManager(IPresenceContainerAdapter adapter,
CollaborationConnection manager) {
sessionManager = manager;
presenceAdapter = adapter;
presenceAdapter.getRosterManager().addRosterSubscriptionListener(
autoResponder);
}
/**
* Set the auto subscription mode to ON or OFF. If set to off then any
* currently assigned autoresponder is set to null.
*
* @param mode
* The auto subscription mode.
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#setAutoSubscriptionMode(boolean)
*/
@Override
public void setAutoSubscriptionMode(boolean auto) {
autoRespond = auto;
if (!auto) {
responder = null;
}
}
/**
*
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#getAutoSubscriptionMode()
*/
@Override
public boolean getAutoSubscriptionMode() {
return autoRespond;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#setSubscriptionRequestResponder(com.raytheon.uf.viz.collaboration.comm.identity.roster.ISubscriptionResponder)
*/
@Override
public void setSubscriptionRequestResponder(ISubscriptionResponder responder) {
this.responder = responder;
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#removeSubscriptionRequestResponder()
*/
@Override
public void removeSubscriptionRequestResponder() {
responder = null;
}
/**
*
* @param password
* The new password. For security the password is a character
* array that will be zero'd after use.
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#changePassword(char[])
*/
@Override
public void changePassword(char[] password) throws CollaborationException {
org.eclipse.ecf.presence.IAccountManager manager = presenceAdapter
.getAccountManager();
if (manager != null) {
try {
manager.changePassword(new String(password));
// all done so clear the password.
Arrays.fill(password, (char) 0);
} catch (ECFException e) {
throw new CollaborationException(
"Could not change account password");
}
}
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#deleteAccount()
*/
@Override
public void deleteAccount() throws CollaborationException {
org.eclipse.ecf.presence.IAccountManager manager = presenceAdapter
.getAccountManager();
if (manager != null) {
try {
manager.deleteAccount();
} catch (ECFException e) {
throw new CollaborationException("Could not delete account");
}
}
}
/**
* Determines if the server allows new accounts to be created by the user.
*
* @throws CollaborationException
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#canCreateAccount()
*/
@Override
public boolean canCreateAccount() throws CollaborationException {
boolean canCreate = false;
org.eclipse.ecf.presence.IAccountManager manager = presenceAdapter
.getAccountManager();
if (manager != null) {
try {
canCreate = manager.isAccountCreationSupported();
} catch (ECFException e) {
throw new CollaborationException(
"Error attempting to determine if accounts may be created.");
}
}
return canCreate;
}
/**
* TODO : Body of method
*
* @param password
* @param attributes
* @see com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager#createAccount(java.lang.String,
* char[], java.util.Map)
*/
@SuppressWarnings("rawtypes")
@Override
public void createAccount(String name, char[] password,
Map<String, String> attributes) throws CollaborationException {
if (name != null) {
if (password != null) {
// create the account
org.eclipse.ecf.presence.IAccountManager manager = presenceAdapter
.getAccountManager();
if (manager != null) {
Map map = null;
if (attributes != null) {
map = (Map) attributes;
}
try {
manager.createAccount(name, new String(password), map);
} catch (ECFException e) {
throw new CollaborationException(
"Could not create account ");
}
}
// all done so clear the password.
Arrays.fill(password, (char) 0);
}
}
}
/**
*
*
* @param userPresence
* @throws CollaborationException
*/
@Override
public void sendPresence(IPresence userPresence)
throws CollaborationException {
IRosterManager manager = presenceAdapter.getRosterManager();
IPresenceSender sender = manager.getPresenceSender();
try {
sender.sendPresenceUpdate(null, userPresence);
sessionManager.setPresence(userPresence);
for (ISession session : sessionManager.getSessions()) {
if (session instanceof IVenueSession) {
((IVenueSession) session).sendPresence(userPresence);
}
}
sessionManager
.postEvent(new UserPresenceChangedEvent(userPresence));
} catch (ECFException e) {
throw new CollaborationException("Could not send presence");
}
}
/**
*
*
* @param userPresence
* @throws CollaborationException
*/
public void sendPresence(ID toId, IPresence userPresence)
throws CollaborationException {
IRosterManager manager = presenceAdapter.getRosterManager();
IPresenceSender sender = manager.getPresenceSender();
try {
sender.sendPresenceUpdate(toId, userPresence);
sessionManager.setPresence(userPresence);
} catch (ECFException e) {
throw new CollaborationException("Could not send presence");
}
}
}

View file

@ -0,0 +1,272 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import com.google.common.eventbus.EventBus;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.ISession;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public abstract class BaseSession implements ISession {
protected final String sessionId;
private EventBus managerEventBus;
private EventBus eventBus;
private Map<Object, Object> eventSubscribers;
private IContainer connectionContainer;
private IPresenceContainerAdapter connectionPresence = null;
private Namespace connectionNamespace = null;
private CollaborationConnection connection;
/**
*
* @param container
* @param externalBus
* @param manager
*/
protected BaseSession(IContainer container, EventBus externalBus,
CollaborationConnection manager) throws CollaborationException {
this(container, externalBus, manager, UUID.randomUUID().toString());
}
/**
*
* @param container
* @param externalBus
* @param manager
* @param sessionId
*/
protected BaseSession(IContainer container, EventBus externalBus,
CollaborationConnection manager, String sessionId)
throws CollaborationException {
// Set the session identifier.
this.sessionId = sessionId;
managerEventBus = externalBus;
eventBus = new EventBus();
connectionContainer = container;
connection = manager;
eventSubscribers = new HashMap<Object, Object>();
setup();
}
/**
*
* @throws ECFException
*/
void setup() {
// Check if the container has been set up previously.
if (connectionContainer != null) {
connectionNamespace = connectionContainer.getConnectNamespace();
connectionPresence = (IPresenceContainerAdapter) connectionContainer
.getAdapter(IPresenceContainerAdapter.class);
}
}
/**
* Get access to the peer to peer session instance.
*
* @return The peer to peer chat session instance.
* @throws CollaborationException
*/
PeerToPeerChat getP2PSession() throws CollaborationException {
return (PeerToPeerChat) connection.getPeerToPeerSession();
}
/**
*
* @return
*/
IContainer getConnectionContainer() {
return connectionContainer;
}
/**
*
* @return
*/
Namespace getConnectionNamespace() {
return connectionNamespace;
}
/**
*
* @return
*/
IPresenceContainerAdapter getConnectionPresenceAdapter() {
return connectionPresence;
}
/**
*
* @return
*/
EventBus getManagerEventPublisher() {
return managerEventBus;
}
/**
*
* @return
*/
CollaborationConnection getSessionManager() {
return connection;
}
/**
*
* @param name
* @return
*/
public ID createID(String name) throws IDCreateException {
ID id = null;
if (connectionNamespace != null) {
id = IDFactory.getDefault().createID(connectionNamespace, name);
}
return id;
}
// *****************
// Implement IEventPublisher methods
// *****************
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISession#getUserID()
*/
@Override
public UserId getUserID() {
return connection.getUser();
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISession#isConnected()
*/
@Override
public boolean isConnected() {
boolean connected = false;
if (connectionContainer != null) {
connected = (connectionContainer.getConnectedID() != null);
}
return connected;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISession#close()
*/
@Override
public void close() {
// Unregister any handlers added using this session
// for(Object o : eventSubscribers.values()) {
// managerEventBus.unregister(o);
// }
connection.removeSession(this);
}
/**
* Get the session identifier.
*
* @return The session id for this session.
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISession#getSessionId()
*/
@Override
public String getSessionId() {
return sessionId;
}
// *****************
// Implement IEventPublisher methods
// *****************
/**
*
* @param handler
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher#registerEventHandler(java.lang.Object)
*/
@Override
public void registerEventHandler(Object handler) {
if (!eventSubscribers.containsKey(handler)) {
eventBus.register(handler);
eventSubscribers.put(handler, handler);
}
}
/**
*
* @param handler
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher#unregisterEventHandler(java.lang.Object)
*/
@Override
public void unregisterEventHandler(Object handler) {
eventSubscribers.remove(handler);
eventBus.unregister(handler);
}
/**
*
*/
@Override
public void postEvent(Object event) {
if (event != null) {
eventBus.post(event);
}
}
@Override
public CollaborationConnection getConnection() {
return connection;
}
}

View file

@ -0,0 +1,736 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.ContainerFactory;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.security.ConnectContextFactory;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresence.Mode;
import org.eclipse.ecf.presence.IPresence.Type;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.IPresenceListener;
import org.eclipse.ecf.presence.Presence;
import org.eclipse.ecf.presence.chatroom.IChatRoomInfo;
import org.eclipse.ecf.presence.chatroom.IChatRoomInvitationListener;
import org.eclipse.ecf.presence.chatroom.IChatRoomManager;
import org.eclipse.ecf.presence.roster.IRoster;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.roster.IRosterItem;
import org.eclipse.ecf.presence.roster.IRosterListener;
import org.eclipse.ecf.presence.roster.IRosterManager;
import org.eclipse.ecf.provider.xmpp.identity.XMPPRoomID;
import com.google.common.eventbus.EventBus;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager;
import com.raytheon.uf.viz.collaboration.comm.identity.ISession;
import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession;
import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession;
import com.raytheon.uf.viz.collaboration.comm.identity.MultipleLoginException;
import com.raytheon.uf.viz.collaboration.comm.identity.UsernamePasswordException;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.RosterChangeType;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenueInfo;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.SharedDisplayVenueInvite;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.VenueInvite;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.event.RosterChangeEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.event.VenueInvitationEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.info.VenueInfo;
import com.raytheon.uf.viz.collaboration.comm.provider.user.ContactsManager;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueId;
/**
*
* <ul>
* <li>EventBus subscription events.</li>
* <ul>
* <li><strong>IVenueInvitationEvent</strong> : This event is posted when the
* SessionManager receives a venue invitation requesting that the user join some
* particular collaboration session.</li>
* <li><strong>IConnectionStatusEvent</strong> : This event is posted when the
* state of the underlying connection changes, reconnecting, connecting,
* disconnected, for example.</li>
* <li><strong>IRosterChangeEvent</strong> : This event is posted when roster
* changes have occurred.</li>
* <li><strong>---------------</strong> : ---------------.</li>
* </ul>
* </ul>
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
* Apr 18, 2012 njensen Major cleanup
*
* </pre>
*
* @author jkorman
* @version 1.0
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent
*/
public class CollaborationConnection implements IEventPublisher {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(CollaborationConnection.class);
private static final String PROVIDER = "com.raytheon.uf.viz.collaboration.comm.xmpp";// "ecf.xmpp.smack";
private static CollaborationConnection instance = null;
private static Map<CollaborationConnectionData, CollaborationConnection> instanceMap = new HashMap<CollaborationConnectionData, CollaborationConnection>();
private Map<String, ISession> sessions;
private UserId account;
private String password;
private UserId user;
private IPresence userPresence;
private IChatRoomInvitationListener intInvitationListener;
private IPresenceContainerAdapter presenceAdapter;
private Namespace connectionNamespace = null;
private PeerToPeerChat chatInstance = null;
private IAccountManager accountManager = null;
private IRosterManager rosterManager = null;
private IContainer container = null;
private EventBus eventBus;
private ContactsManager contactsMgr;
private CollaborationConnectionData connectionData;
private CollaborationConnection(CollaborationConnectionData connectionData)
throws CollaborationException {
this.connectionData = connectionData;
UserId account = new UserId(connectionData.getUserName(),
connectionData.getServer());
String password = connectionData.getPassword();
IPresence initialPresence = new Presence(Type.AVAILABLE,
connectionData.getMessage(), Mode.fromString(connectionData
.getStatus().toLowerCase()),
connectionData.getAttributes());
eventBus = new EventBus();
sessions = new HashMap<String, ISession>();
try {
container = ContainerFactory.getDefault().createContainer(PROVIDER);
if (container != null) {
// add the listeners before we connect so we don't potentially
// miss something
presenceAdapter = Tools.getPresenceContainerAdapter(container,
IPresenceContainerAdapter.class);
this.setupInternalConnectionListeners();
}
} catch (ContainerCreateException cce) {
closeInternals();
throw new CollaborationException(String.format(
"Could not create container for provider [%s]", PROVIDER));
}
this.account = account;
this.password = password;
try {
connectToContainer();
} catch (ContainerConnectException e) {
closeInternals();
// ECF does a very good job of wrapping up login exceptions so it is
// hard to tell why the login failed. This code will attempt to
// analyze the cause of the failure and in some circumstances
// produce a helpful error. Since this is relying on string
// comparison of exception messages it is very likely that if the
// ECF provider is changed or updated that this will stop producing
// helpful messages. Unfortunately ECF does not provide any other
// mechanism for figuring out why login failed.
for (Throwable t = e; t != null && t != t.getCause(); t = t
.getCause()) {
if (t.getMessage().contains("authentication failed")) {
throw new UsernamePasswordException(
"Login failed. Invalid username or password", e);
} else if (t.getMessage().equals("conflict(409)")) {
throw new MultipleLoginException(
"Login failed. User already logged in elsewhere",
e);
}
}
// In cases where we can't produce anything helpful, at least let
// the user know that it failed and hopeful something in the stack
// trace will be useful in the DR.
throw new CollaborationException("Login failed.", e);
}
ID id = container.getConnectedID();
if (id != null) {
String name = Tools.parseName(id.getName());
String host = Tools.parseHost(id.getName());
String resource = Tools.parseResource(id.getName());
user = new UserId(name, host, resource);
user.setId(id);
}
setupAccountManager();
setupInternalVenueInvitationListener();
setupP2PComm(presenceAdapter);
getPeerToPeerSession();
userPresence = initialPresence;
if (accountManager != null && initialPresence != null) {
accountManager.sendPresence(initialPresence);
}
contactsMgr = new ContactsManager(this);
this.registerEventHandler(contactsMgr);
instanceMap.put(connectionData, this);
if (instance == null) {
instance = this;
}
}
public CollaborationConnectionData getConnectionData() {
return connectionData;
}
/**
* @return
* @see com.raytheon.uf.viz.collaboration.comm.identity.roster.IRoster#getUser()
*/
public UserId getUser() {
return user;
}
/**
*
* @return
*/
public IPresence getPresence() {
return userPresence;
}
/**
*
* @return
*/
public void setPresence(IPresence presence) {
userPresence = presence;
}
/**
* @throws CollaborationException
* @throws ContainerConnectException
*
*/
private void connectToContainer() throws CollaborationException,
ContainerConnectException {
if (container.getConnectedID() == null) {
connectionNamespace = container.getConnectNamespace();
// Now connect
ID targetID = createID(account);
presenceAdapter = Tools.getPresenceContainerAdapter(container,
IPresenceContainerAdapter.class);
container.connect(targetID, ConnectContextFactory
.createPasswordConnectContext(password));
}
}
/**
*
*/
private void setupAccountManager() {
if (accountManager == null) {
if (isConnected() && (presenceAdapter != null)) {
accountManager = new AccountManager(presenceAdapter, this);
}
}
}
/**
* Get the account manager for this connection.
*
* @return The account manager for this connection.
*/
public IAccountManager getAccountManager() {
if (accountManager == null) {
setupAccountManager();
}
return accountManager;
}
/**
*
*/
private void setupRosterManager() {
rosterManager = presenceAdapter.getRosterManager();
}
/**
*
* @return
*/
public IPresenceContainerAdapter getPresenceContainerAdapter() {
return presenceAdapter;
}
/**
*
* @return
*/
public IRosterManager getRosterManager() {
if (rosterManager == null) {
setupRosterManager();
}
return rosterManager;
}
/**
* Is this SessionManager currently connected?
*
* @return Is this SessionManager currently connected?
*/
public boolean isConnected() {
return ((container != null) && (container.getConnectedID() != null));
}
private void closeInternals() {
if (container != null) {
chatInstance = null;
// Get rid of the account and roster managers
container.disconnect();
container.dispose();
container = null;
}
instanceMap.remove(connectionData);
if (this == instance) {
instance = null;
}
}
/**
*
*/
public void close() {
if (container != null) {
// Close any created sessions.
Collection<ISession> toRemove = sessions.values();
sessions.clear();
for (ISession session : toRemove) {
if ((chatInstance != null) && chatInstance.equals(session)) {
chatInstance.close();
chatInstance = null;
} else {
session.close();
}
}
chatInstance = null;
}
closeInternals();
}
/**
* Get the PeerToPeerChat session instance.
*
* @return
*/
public ISession getPeerToPeerSession() throws CollaborationException {
if (chatInstance == null) {
chatInstance = new PeerToPeerChat(container, eventBus, this);
sessions.put(chatInstance.getSessionId(), chatInstance);
postEvent(chatInstance);
}
return chatInstance;
}
public ISharedDisplaySession joinCollaborationVenue(
IVenueInvitationEvent invitation) throws CollaborationException {
SharedDisplaySession session = null;
String venueName = invitation.getRoomId().getName();
String sessionId = invitation.getInvite().getSessionId();
session = new SharedDisplaySession(container, eventBus, this, sessionId);
if (session != null) {
session.joinVenue(venueName);
if (invitation.getInvite() instanceof SharedDisplayVenueInvite) {
SharedDisplayVenueInvite invite = (SharedDisplayVenueInvite) invitation
.getInvite();
session.setCurrentDataProvider(invite.getDataProvider());
session.setCurrentSessionLeader(invite.getSessionLeader());
}
sessions.put(session.getSessionId(), session);
postEvent(session);
}
return session;
}
/**
*
* @param venueName
* @return
* @throws CollaborationException
*/
public ISharedDisplaySession createCollaborationVenue(String venueName,
String subject) throws CollaborationException {
SharedDisplaySession session = null;
try {
session = new SharedDisplaySession(container, eventBus, this);
session.createVenue(venueName, subject);
session.setCurrentSessionLeader(user);
session.setCurrentDataProvider(user);
sessions.put(session.getSessionId(), session);
postEvent(session);
return session;
} catch (Exception e) {
throw new CollaborationException(
"Error creating collaboration venue " + venueName, e);
}
}
/**
*
* @param venueName
* @return
* @throws CollaborationException
*/
public IVenueSession joinTextOnlyVenue(String venueName)
throws CollaborationException {
VenueSession session = null;
try {
session = new VenueSession(container, eventBus, this);
if (session != null) {
session.joinVenue(venueName);
sessions.put(session.getSessionId(), session);
postEvent(session);
}
} catch (Exception e) {
throw new CollaborationException(
"Error joining venue " + venueName, e);
}
return session;
}
/**
*
* @param venueName
* @return
* @throws CollaborationException
*/
public IVenueSession createTextOnlyVenue(String venueName, String subject)
throws CollaborationException {
VenueSession session = null;
try {
session = new VenueSession(container, eventBus, this);
if (session != null) {
session.createVenue(venueName, subject);
sessions.put(session.getSessionId(), session);
postEvent(session);
}
} catch (Exception e) {
throw new CollaborationException("Error creating venue "
+ venueName, e);
}
return session;
}
/**
*
* @param session
*/
protected void removeSession(ISession session) {
sessions.remove(session.getSessionId());
postEvent(session);
}
/**
*
* @return
*/
public Collection<IVenueInfo> getVenueInfo() {
// Check to see if the container has been connected.
Collection<IVenueInfo> info = new ArrayList<IVenueInfo>();
if (isConnected()) {
IPresenceContainerAdapter presenceAdapter = Tools
.getPresenceContainerAdapter(container,
IPresenceContainerAdapter.class);
IChatRoomManager venueManager = presenceAdapter
.getChatRoomManager();
if (venueManager != null) {
IChatRoomInfo[] roomInfo = venueManager.getChatRoomInfos();
for (IChatRoomInfo rInfo : roomInfo) {
IVenueInfo vi = new VenueInfo(rInfo);
info.add(vi);
}
}
}
return info;
}
// ***************************
// Connection listener
// ***************************
/**
*
*/
private void setupInternalConnectionListeners() {
presenceAdapter.getRosterManager().addPresenceListener(
new IPresenceListener() {
@Override
public void handlePresence(ID fromId,
org.eclipse.ecf.presence.IPresence presence) {
if (rosterManager != null) {
if (contactsMgr != null) {
IUser u = contactsMgr.getUser(fromId);
if (u != null) {
IRosterEntry entry = contactsMgr
.getRosterEntry(u);
eventBus.post(entry);
}
}
}
}
});
presenceAdapter.getRosterManager().addRosterListener(
new IRosterListener() {
@Override
public void handleRosterEntryAdd(IRosterEntry entry) {
IRosterChangeEvent event = new RosterChangeEvent(
RosterChangeType.ADD, entry);
eventBus.post(event);
}
@Override
public void handleRosterUpdate(IRoster roster,
IRosterItem item) {
IRosterChangeEvent event = new RosterChangeEvent(
RosterChangeType.MODIFY, item);
eventBus.post(event);
}
@Override
public void handleRosterEntryRemove(IRosterEntry entry) {
IRosterChangeEvent event = new RosterChangeEvent(
RosterChangeType.DELETE, entry);
eventBus.post(event);
}
});
}
public ISession getSession(String sessionId) {
return sessions.get(sessionId);
}
private void setupP2PComm(IPresenceContainerAdapter presenceAdapter) {
if (isConnected() && (presenceAdapter != null)) {
PeerToPeerCommHelper helper = new PeerToPeerCommHelper(this);
presenceAdapter.getChatManager().addMessageListener(helper);
}
}
// ***************************
// Venue invitation listener management
// ***************************
/**
*
*/
private void setupInternalVenueInvitationListener() {
if (isConnected() && (presenceAdapter != null)) {
IChatRoomManager venueManager = presenceAdapter
.getChatRoomManager();
if (venueManager != null) {
intInvitationListener = new IChatRoomInvitationListener() {
@Override
public void handleInvitationReceived(ID roomID, ID from,
String subject, String body) {
IQualifiedID venueId = null;
if (roomID instanceof XMPPRoomID) {
XMPPRoomID room = (XMPPRoomID) roomID;
venueId = new VenueId();
venueId.setName(room.getLongName());
}
if (venueId != null) {
IQualifiedID id = IDConverter.convertFrom(from);
UserId invitor = new UserId(id.getName(),
id.getHost(), id.getResource());
VenueInvite received;
try {
received = (VenueInvite) Tools
.unMarshallData(body);
if (subject == null) {
subject = received.getSubject();
if (subject == null) {
subject = presenceAdapter
.getChatRoomManager()
.getChatRoomInfo(
roomID.getName())
.getSubject();
}
}
IVenueInvitationEvent invite = new VenueInvitationEvent(
venueId, invitor, subject, received);
eventBus.post(invite);
} catch (CollaborationException e) {
statusHandler
.handle(Priority.PROBLEM,
"Error handling received invite message",
e);
}
}
}
};
venueManager.addInvitationListener(intInvitationListener);
}
}
}
/**
* Register an event handler with this
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher#registerEventHandler(java.lang.Object)
*/
@Override
public void registerEventHandler(Object handler) {
eventBus.register(handler);
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IEventPublisher#unregisterEventHandler(java.lang.Object)
*/
@Override
public void unregisterEventHandler(Object handler) {
eventBus.unregister(handler);
}
@Override
public void postEvent(Object event) {
if (event != null) {
eventBus.post(event);
}
}
public ContactsManager getContactsManager() {
return contactsMgr;
}
/**
*
* @param name
* @return
*/
public ID createID(UserId name) throws CollaborationException {
ID id = null;
try {
if (connectionNamespace != null) {
id = IDFactory.getDefault().createID(connectionNamespace,
name.getFQName());
}
} catch (IDCreateException idce) {
throw new CollaborationException("Could not create id");
}
return id;
}
public Collection<ISession> getSessions() {
return sessions.values();
}
/**
* Returns the currently connected connection or null if it's not connected
*
* @return
*/
public static CollaborationConnection getConnection() {
return instance;
}
/**
* Create a {@link CollaborationConnection} given the
* {@link CollaborationConnectionData}
*
* @param userData
* @return
* @throws CollaborationException
*/
public static CollaborationConnection connect(
CollaborationConnectionData userData) throws CollaborationException {
if (instance != null) {
throw new CollaborationException("Already connected");
} else {
instance = new CollaborationConnection(userData);
return getConnection();
}
}
}

View file

@ -0,0 +1,218 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.HashMap;
import java.util.Map;
/**
* Collaboration connection data object used for creating a {@link CollaborationConnection}
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 18, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class CollaborationConnectionData {
private String server;
private String userName;
private String password;
private String status;
private String message;
private Map<String, String> attributes;
public CollaborationConnectionData() {
attributes = new HashMap<String, String>();
}
/**
* @return the server
*/
public String getServer() {
return server;
}
/**
* @param server
* the server to set
*/
public void setServer(String server) {
this.server = server;
}
/**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName
* the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password
* the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the status
*/
public String getStatus() {
return status;
}
/**
* @param status
* the status to set
*/
public void setStatus(String status) {
this.status = status;
}
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message
* the message to set
*/
public void setMessage(String message) {
this.message = message;
}
/**
* @return the attributes
*/
public Map<String, String> getAttributes() {
return new HashMap<String, String>(attributes);
}
/**
* @param attributes
* the attributes to set
*/
public void setAttributes(Map<String, String> attributes) {
this.attributes = new HashMap<String, String>(attributes);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((attributes == null) ? 0 : attributes.hashCode());
result = prime * result + ((message == null) ? 0 : message.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result + ((server == null) ? 0 : server.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result
+ ((userName == null) ? 0 : userName.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CollaborationConnectionData other = (CollaborationConnectionData) obj;
if (attributes == null) {
if (other.attributes != null)
return false;
} else if (!attributes.equals(other.attributes))
return false;
if (message == null) {
if (other.message != null)
return false;
} else if (!message.equals(other.message))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (server == null) {
if (other.server != null)
return false;
} else if (!server.equals(other.server))
return false;
if (status == null) {
if (other.status != null)
return false;
} else if (!status.equals(other.status))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
}

View file

@ -0,0 +1,128 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.im.IChatMessage;
import org.eclipse.ecf.presence.im.IChatMessageSender;
import com.google.common.eventbus.EventBus;
import com.raytheon.uf.viz.collaboration.comm.Activator;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IMessage;
import com.raytheon.uf.viz.collaboration.comm.identity.IPeerToPeer;
import com.raytheon.uf.viz.collaboration.comm.identity.IPropertied.Property;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
/**
*
*
* Only one instance of this class should be created.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 21, 2012 jkorman Initial creation
* Apr 18, 2012 njensen Cleanup
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class PeerToPeerChat extends BaseSession implements IPeerToPeer {
private IChatMessageSender chatSender = null;
/**
*
* @param container
* @param externalBus
* @param manager
*/
PeerToPeerChat(IContainer container, EventBus externalBus,
CollaborationConnection manager) throws CollaborationException {
super(container, externalBus, manager);
chatSender = getConnectionPresenceAdapter().getChatManager()
.getChatMessageSender();
}
/**
* @throws CollaborationException
*
*/
@Override
public void sendPeerToPeer(IMessage message) throws CollaborationException {
if (chatSender != null) {
ID toID = createID(message.getTo().getFQName());
String subject = message.getSubject();
String body = message.getBody();
Collection<Property> properties = message.getProperties();
Map<String, String> props = null;
if ((properties != null) && (properties.size() > 0)) {
props = new HashMap<String, String>();
for (Property p : properties) {
props.put(p.getKey(), p.getValue());
}
}
try {
Activator
.getDefault()
.getNetworkStats()
.log(Activator.PEER_TO_PEER,
message.getBody().length(), 0);
chatSender.sendChatMessage(toID, null, IChatMessage.Type.CHAT,
subject, body, props);
} catch (ECFException e) {
throw new CollaborationException(
"Error sending message to peer "
+ message.getTo().getName(), e);
}
}
}
/**
* Send a message to the named recipient.
*
* @param to
* The recipient of the message.
* @param message
* The body of the message to send.
* @throws CollaborationException
*/
@Override
public void sendPeerToPeer(IQualifiedID to, String message)
throws CollaborationException {
TextMessage msg = new TextMessage(to, message);
this.sendPeerToPeer(msg);
}
}

View file

@ -0,0 +1,259 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.Map;
import org.eclipse.ecf.presence.IIMMessageEvent;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.im.IChatMessage;
import org.eclipse.ecf.presence.im.IChatMessageEvent;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.collaboration.comm.Activator;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.ISession;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IHttpdCollaborationConfigurationEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IHttpdXmppMessage;
import com.raytheon.uf.viz.collaboration.comm.identity.event.ITextMessageEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.event.ChatMessageEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.event.HttpdCollaborationConfigurationEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
/**
* Listens for peer to peer messages and routes them appropriately.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 28, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class PeerToPeerCommHelper implements IIMMessageListener {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(PeerToPeerCommHelper.class);
private static Object httpServerLockObj = new Object();
private static String httpServer;
public static String getCollaborationHttpServer() {
/**
* Wait for initialization of field httpServer.
*/
synchronized (httpServerLockObj) {
try {
while (httpServer == null) {
httpServerLockObj.wait(500);
}
} catch (InterruptedException e) {
statusHandler.handle(Priority.PROBLEM,
"PeerToPeerCommHelper unable to resolve server URL. "
+ e.getLocalizedMessage(), e);
}
}
return httpServer;
}
private CollaborationConnection manager;
/**
*
* @param manager
* @param presenceAdapter
*/
protected PeerToPeerCommHelper(CollaborationConnection manager) {
this.manager = manager;
}
/**
*
*/
@Override
public void handleMessageEvent(IIMMessageEvent messageEvent) {
if (messageEvent instanceof IChatMessageEvent) {
IChatMessageEvent event = (IChatMessageEvent) messageEvent;
IChatMessage msg = event.getChatMessage();
String body = msg.getBody();
Activator.getDefault().getNetworkStats()
.log(Activator.PEER_TO_PEER, 0, body.length());
if (body != null) {
if (body.startsWith(Tools.CMD_PREAMBLE)) {
routeData(msg);
} else if (body.startsWith(Tools.CONFIG_PREAMBLE)) {
this.handleConfiguration(body);
} else {
// anything else pass to the normal text
routeMessage(msg);
}
}
}
}
/**
*
* @param message
*/
private void routeData(IChatMessage message) {
Object object = null;
try {
object = Tools.unMarshallData(message.getBody());
} catch (CollaborationException e) {
statusHandler.handle(Priority.PROBLEM,
"Error unmarshalling PeerToPeer data", e);
}
if (object != null) {
String sessionId = (String) message.getProperties().get(
Tools.PROP_SESSION_ID);
if (sessionId == null) {
manager.postEvent(object);
} else {
// Ok, we have a session id.
ISession session = manager.getSession(sessionId);
if (session != null) {
session.postEvent(object);
} else {
statusHandler.handle(Priority.PROBLEM,
"ERROR: Unknown sessionid [" + sessionId + "]");
}
}
}
}
/**
*
* @param message
*/
private void routeMessage(IChatMessage message) {
IQualifiedID fromId = IDConverter.convertFrom(message.getFromID());
fromId.setResource(Tools.parseResource(message.getFromID().getName()));
TextMessage textMsg = new TextMessage(fromId, message.getBody());
textMsg.setFrom(fromId);
textMsg.setBody(message.getBody());
textMsg.setSubject(message.getSubject());
@SuppressWarnings("unchecked")
Map<Object, Object> props = message.getProperties();
for (Object o : props.keySet()) {
if (o instanceof String) {
String key = (String) o;
Object v = props.get(key);
if (v instanceof String) {
textMsg.setProperty(key, (String) v);
}
}
}
ITextMessageEvent chatEvent = new ChatMessageEvent(textMsg);
String sessionId = (String) message.getProperties().get(
Tools.PROP_SESSION_ID);
// Now find out who gets the message. If the message doesn't contain
// a session id then assume its a straight text chat message.
if (sessionId == null) {
manager.postEvent(chatEvent);
} else {
// Ok, we have a session id.
ISession session = manager.getSession(sessionId);
if (session != null) {
session.postEvent(chatEvent);
}
}
}
private void handleConfiguration(String body) {
// Determine if an error has occurred.
if (IHttpdXmppMessage.configErrorPattern.matcher(body).matches()) {
statusHandler.handle(
UFStatus.Priority.ERROR,
this.getCollaborationConfigurationParameterValue(body,
IHttpdXmppMessage.ERROR_PARAMETER_NAME)
+ ". Shared Display Sessions have been disabled.");
this.disableSharedDisplaySession();
// terminate execution
return;
}
// Validate the configuration.
if (IHttpdXmppMessage.configURLPattern.matcher(body).matches() == false) {
statusHandler
.handle(UFStatus.Priority.PROBLEM,
"Received invalid configuration from openfire. Shared Display Sessions have been disabled.");
this.disableSharedDisplaySession();
return;
}
// Remove the parameter name.
String httpdCollaborationURL = this
.getCollaborationConfigurationParameterValue(body,
IHttpdXmppMessage.URL_PARAMETER_NAME);
// validate the url.
if (IHttpdXmppMessage.urlPattern.matcher(httpdCollaborationURL)
.matches() == false) {
statusHandler.handle(UFStatus.Priority.PROBLEM,
"Received an invalid http url from openfire - "
+ httpdCollaborationURL
+ ". Shared Display Sessions have been disabled.");
this.disableSharedDisplaySession();
return;
}
synchronized (httpServerLockObj) {
httpServer = httpdCollaborationURL;
httpServerLockObj.notifyAll();
}
// configuration is valid; publish it.
IHttpdCollaborationConfigurationEvent configurationEvent = new HttpdCollaborationConfigurationEvent(
httpdCollaborationURL);
manager.postEvent(configurationEvent);
}
private String getCollaborationConfigurationParameterValue(String body,
String parameterName) {
// Eliminate the preamble.
String encodedConfiguration = body.replace(Tools.CONFIG_PREAMBLE, "");
// Eliminate the suffix: ]]
encodedConfiguration = encodedConfiguration.substring(0,
encodedConfiguration.length() - 2);
// Remove the parameter name.
return encodedConfiguration.replace(parameterName + " :", "").trim();
}
private void disableSharedDisplaySession() {
// ensure that the shared session displays will be disabled
IHttpdCollaborationConfigurationEvent configurationEvent = new HttpdCollaborationConfigurationEvent(
null);
manager.postEvent(configurationEvent);
}
}

View file

@ -0,0 +1,139 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import org.eclipse.ecf.core.IContainer;
import com.google.common.eventbus.EventBus;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession;
import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 18, 2012 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class SharedDisplaySession extends VenueSession implements
ISharedDisplaySession {
private UserId sessionLeader = null;
private UserId dataProvider = null;
public SharedDisplaySession(IContainer container, EventBus externalBus,
CollaborationConnection manager) throws CollaborationException {
super(container, externalBus, manager);
}
public SharedDisplaySession(IContainer container, EventBus externalBus,
CollaborationConnection manager, String sessionId)
throws CollaborationException {
super(container, externalBus, manager, sessionId);
}
@Override
public void sendObjectToVenue(Object obj) throws CollaborationException {
if (obj != null) {
String message = Tools.marshallData(obj);
if (message != null) {
sendMessageToVenue(message);
}
}
}
@Override
public void sendObjectToPeer(
com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID participant,
Object obj) throws CollaborationException {
PeerToPeerChat session = getP2PSession();
if (session != null) {
String message = Tools.marshallData(obj);
if (message != null) {
TextMessage msg = new TextMessage(participant, message);
msg.setProperty(Tools.PROP_SESSION_ID, getSessionId());
session.sendPeerToPeer(msg);
}
}
}
/**
* Get the identification of the user who is the DataProvider.
*
* @return The DataProvider user identification.
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession#getCurrentDataProvider()
*/
@Override
public UserId getCurrentDataProvider() {
return dataProvider;
}
/**
* Get the identification of the user who is the Session Leader.
*
* @return The Session Leader user identification.
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession#getCurrentSessionLeader()
*/
@Override
public UserId getCurrentSessionLeader() {
return sessionLeader;
}
/**
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession#hasRole(com.raytheon.uf.viz.collaboration.comm.identity.user.ParticipantRole)
*/
@Override
public boolean hasRole(SharedDisplayRole role) {
boolean result = true;
if (role.equals(SharedDisplayRole.DATA_PROVIDER)
&& !this.getUserID().equals(this.getCurrentDataProvider())) {
result = false;
} else if (role.equals(SharedDisplayRole.SESSION_LEADER)
&& !this.getUserID().equals(this.getCurrentSessionLeader())) {
result = false;
}
return result;
}
@Override
public void setCurrentSessionLeader(UserId id) {
sessionLeader = id;
}
@Override
public void setCurrentDataProvider(UserId id) {
dataProvider = id;
}
}

View file

@ -0,0 +1,527 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.session;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.IIMMessageEvent;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.chatroom.IChatRoomContainer;
import org.eclipse.ecf.presence.chatroom.IChatRoomInfo;
import org.eclipse.ecf.presence.chatroom.IChatRoomInvitationSender;
import org.eclipse.ecf.presence.chatroom.IChatRoomManager;
import org.eclipse.ecf.presence.chatroom.IChatRoomMessage;
import org.eclipse.ecf.presence.chatroom.IChatRoomMessageEvent;
import org.eclipse.ecf.presence.chatroom.IChatRoomMessageSender;
import org.eclipse.ecf.presence.chatroom.IChatRoomParticipantListener;
import com.google.common.eventbus.EventBus;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.collaboration.comm.Activator;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IMessage;
import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession;
import com.raytheon.uf.viz.collaboration.comm.identity.event.ParticipantEventType;
import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenue;
import com.raytheon.uf.viz.collaboration.comm.identity.invite.VenueInvite;
import com.raytheon.uf.viz.collaboration.comm.provider.CollaborationMessage;
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.event.VenueParticipantEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.info.Venue;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
*
* <ul>
* <li>EventBus subscription events.</li>
* <ul>
* <li><strong>IVenueParticipantEvent</strong> : This event is posted when a
* venue participant enters, leaves a venue, or updates their status in the
* venue.</li>
* <li><strong>TextMessage</strong> : Text messages send between users. Meant to
* be displayed as conversation.</li>
* <li><strong>CollaborationMessage</strong> : These messages are CAVE to CAVE
* command messages.</li>
* </ul>
* </ul>
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
* Apr 17, 2012 njensen Major refactor
*
* </pre>
*
* @author jkorman
* @version 1.0
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEvent
* @see com.raytheon.uf.viz.collaboration.comm.provider.TextMessage
* @see com.raytheon.uf.viz.collaboration.comm.provider.CollaborationMessage
*/
public class VenueSession extends BaseSession implements IVenueSession {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(VenueSession.class);
private static final String SEND_CMD = "[[COMMAND";
private static final String SEND_TXT = "[[TEXT]]";
public static final String SEND_HISTORY = "[[HISTORY]]";
private IChatRoomInfo venueInfo = null;
private IChatRoomContainer venueContainer = null;
private IIMMessageListener intListener = null;
private IChatRoomParticipantListener participantListener = null;
private Venue venue;
/**
*
* @param container
* @param eventBus
*/
protected VenueSession(IContainer container, EventBus externalBus,
CollaborationConnection manager, String sessionId)
throws CollaborationException {
super(container, externalBus, manager, sessionId);
}
/**
*
* @param container
* @param eventBus
*/
protected VenueSession(IContainer container, EventBus externalBus,
CollaborationConnection manager) throws CollaborationException {
super(container, externalBus, manager);
}
/**
* Close this session. Closing clears all listeners and disposes of the
* container. No errors for attempting to close an already closed session.
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.ISession#close()
*/
@Override
public void close() {
if (intListener != null) {
venueContainer.removeMessageListener(intListener);
intListener = null;
}
if (participantListener != null) {
venueContainer
.removeChatRoomParticipantListener(participantListener);
participantListener = null;
}
if (venueContainer != null) {
venueContainer.disconnect();
venueContainer = null;
}
venueInfo = null;
super.close();
}
/**
* Get information about this venue.
*
* @return The information about this venue. May return a null reference if
* the venue is not connected.
*/
@Override
public IVenue getVenue() {
return venue;
}
/**
* Send an invitation from this venue to another user.
*
* @param room
* The target venue for this invitation.
* @param id
* The target user for this invitation.
* @param subject
* The intended subject of the venue conversation.
* @param body
* Any text that the user may wish to include.
* @throws CollaborationException
* @see com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession#sendInvitation(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void sendInvitation(UserId id, VenueInvite invite)
throws CollaborationException {
IChatRoomInvitationSender sender = getConnectionPresenceAdapter()
.getChatRoomManager().getInvitationSender();
if (sender != null) {
String msgBody = Tools.marshallData(invite);
ID roomId = venueInfo.getConnectedID();
ID userId = IDFactory.getDefault().createID(
getConnectionNamespace(), id.getFQName());
try {
sender.sendInvitation(roomId, userId, invite.getSubject(),
msgBody);
} catch (ECFException e) {
throw new CollaborationException("Error sending invitation", e);
}
}
}
/**
* Send an invitation from this venue to another user.
*
* @param room
* The target venue for this invitation.
* @param id
* The target user for this invitation.
* @param subject
* The intended subject of the venue conversation.
* @param body
* Any text that the user may wish to include.
* @see com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession#sendInvitation(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void sendInvitation(List<UserId> ids, VenueInvite invite)
throws CollaborationException {
if (ids != null) {
for (UserId id : ids) {
sendInvitation(id, invite);
}
}
}
@Override
public void sendChatMessage(String message) throws CollaborationException {
this.sendMessageToVenue(message);
}
protected void sendMessageToVenue(String message)
throws CollaborationException {
// Assume success
if ((venueContainer != null) && (message != null)) {
Activator.getDefault().getNetworkStats()
.log(Activator.VENUE, message.length(), 0);
IChatRoomMessageSender sender = venueContainer
.getChatRoomMessageSender();
try {
if (message.startsWith(SEND_CMD)) {
sender.sendMessage(message);
} else {
sender.sendMessage(SEND_TXT + message);
}
} catch (ECFException e) {
throw new CollaborationException("Error sending messge", e);
}
}
}
protected IChatRoomInfo joinVenue(String venueName)
throws CollaborationException {
// Create chat room container from manager
IChatRoomManager venueManager = getConnectionPresenceAdapter()
.getChatRoomManager();
if (venueManager != null) {
venueInfo = venueManager.getChatRoomInfo(venueName);
if (venueInfo == null) {
throw new CollaborationException("Unable to join venue "
+ venueName + ". Venue may have been closed already.");
}
completeVenueConnection(venueInfo);
}
return venueInfo;
}
/**
* This does NOT connect to the room, it only creates the venue and returns
* the info. To connect, connectToRoom must be called.
*
* @param venueName
* @throws CollaborationException
* @throws Exception
* @see com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession#createVenue(java.lang.String,
* java.lang.String)
*/
protected IChatRoomInfo createVenue(String venueName, String subject)
throws CollaborationException {
try {
// Create chat room container from manager
IChatRoomManager venueManager = getConnectionPresenceAdapter()
.getChatRoomManager();
if (venueManager != null) {
venueInfo = venueManager.getChatRoomInfo(venueName);
if (venueInfo == null) {
Map<String, String> props = null;
if (subject != null) {
props = new HashMap<String, String>();
props.put(Tools.VENUE_SUBJECT_PROP, subject);
}
venueInfo = venueManager.createChatRoom(venueName, props);
completeVenueConnection(venueInfo);
}
}
} catch (Exception e) {
throw new CollaborationException("Error creating venue "
+ venueName, e);
}
return venueInfo;
}
/**
*
* @return
* @throws CollaborationException
*/
private void completeVenueConnection(IChatRoomInfo venueInfo)
throws CollaborationException {
if (venueInfo != null) {
try {
venueContainer = venueInfo.createChatRoomContainer();
this.venue = new Venue(venueContainer, venueInfo);
} catch (ContainerCreateException e) {
throw new CollaborationException(
"Error completing connection to venue", e);
}
}
}
/**
* Allows users to connect after the fact so that they do not miss any
* messages coming from the room (after the dialog/view has been
* instanstiated)
*/
public void connectToRoom() {
try {
IChatRoomParticipantListener pListener = new IChatRoomParticipantListener() {
@Override
public void handleArrived(IUser participant) {
UserId user = IDConverter.convertFrom(participant);
postEvent(new VenueParticipantEvent(user,
ParticipantEventType.ARRIVED));
}
@Override
public void handleUpdated(IUser participant) {
UserId user = IDConverter.convertFrom(participant);
postEvent(new VenueParticipantEvent(user,
ParticipantEventType.UPDATED));
}
@Override
public void handleDeparted(IUser participant) {
UserId user = IDConverter.convertFrom(participant);
postEvent(new VenueParticipantEvent(user,
ParticipantEventType.DEPARTED));
}
@Override
public void handlePresenceUpdated(ID fromID,
org.eclipse.ecf.presence.IPresence presence) {
venue.handlePresenceUpdated(fromID, presence);
UserId user = IDConverter.convertFrom(fromID);
postEvent(new VenueParticipantEvent(user, presence,
ParticipantEventType.PRESENCE_UPDATED));
}
};
venueContainer.addChatRoomParticipantListener(pListener);
venueContainer.connect(venueInfo.getRoomID(), null);
if (venueContainer.getConnectedID() != null) {
intListener = new IIMMessageListener() {
public void handleMessageEvent(IIMMessageEvent messageEvent) {
if (messageEvent instanceof IChatRoomMessageEvent) {
IChatRoomMessage m = ((IChatRoomMessageEvent) messageEvent)
.getChatRoomMessage();
Activator
.getDefault()
.getNetworkStats()
.log(Activator.VENUE, 0,
m.getMessage().length());
if (accept(m)) {
distributeMessage(convertMessage(m));
}
}
}
};
venueContainer.addMessageListener(intListener);
sendPresence(CollaborationConnection.getConnection()
.getPresence());
}
} catch (CollaborationException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
} catch (ContainerConnectException e) {
statusHandler.handle(Priority.ERROR,
"Unable to connect to container", e);
}
}
/**
* Examine the incoming message to determine if it should be forwarded. The
* method looks at the from identifier to determine who sent the message.
*
* @param message
* A message to accept.
* @return Should the message be accepted.
*/
private boolean accept(IChatRoomMessage message) {
boolean acceptMessage = true;
String body = message.getMessage();
// Command data only
if (body.startsWith(SEND_CMD)) {
ID from = message.getFromID();
String name = Tools.parseName(from.getName());
UserId account = getSessionManager().getUser();
String aName = account.getFQName();
if (aName.equals(name)) {
acceptMessage = false;
}
}
return acceptMessage;
}
/**
*
* @param message
*/
private void distributeMessage(IMessage message) {
if (message != null) {
String body = message.getBody();
if (body != null) {
if (body.startsWith(SEND_CMD)) {
Object o = null;
try {
o = Tools.unMarshallData(body);
if (o != null) {
this.postEvent(o);
}
} catch (CollaborationException ce) {
statusHandler.error(
"Error deserializing received message on venue "
+ venueInfo.getName(), ce);
}
} else if (body.startsWith(SEND_TXT)) {
body = body.substring(SEND_TXT.length());
message.setBody(body);
TextMessage msg = new TextMessage(message.getTo(),
message.getBody());
msg.setFrom(message.getFrom());
this.postEvent(msg);
} else if (body.startsWith(SEND_HISTORY)) {
String[] vars = body.split("\\|");
String timeString = vars[0]
.substring(SEND_HISTORY.length());
long time = Long.parseLong(timeString);
String username = vars[1];
String site = vars[2];
// add the SEND_HISTORY tag length, and the timestamp
// length, username length, and the site length plus the
// three pipe characters
String moddedBody = body.substring(SEND_HISTORY.length()
+ timeString.length() + username.length()
+ site.length() + SEND_TXT.length() + 3);
message.setBody(moddedBody);
TextMessage msg = new TextMessage(message.getFrom(),
message.getBody());
UserId id = new UserId(username, CollaborationConnection
.getConnection().getConnectionData().getServer());
msg.setFrom(id);
msg.setTimeStamp(time);
msg.setSubject(site);
msg.setStatus(SEND_HISTORY);
this.postEvent(msg);
} else {
// attempt to handle outside clients as text only since the
// SEND_TXT won't be appended to the first portion of the
// body
message.setBody(body);
TextMessage msg = new TextMessage(message.getTo(),
message.getBody());
msg.setFrom(message.getFrom());
this.postEvent(msg);
}
}
}
}
/**
* Convert from an ECF chat room message to an IMessage instance.
*
* @param msg
* The ECF chat room message to convert.
* @return The converted message.
*/
private IMessage convertMessage(IChatRoomMessage msg) {
IMessage message = null;
String body = msg.getMessage();
if (body != null) {
message = new CollaborationMessage(null, msg.getMessage());
message.setFrom(IDConverter.convertFrom(msg.getFromID()));
}
return message;
}
@Override
public void sendPresence(IPresence presence) throws CollaborationException {
try {
CollaborationConnection.getConnection().getRosterManager()
.getPresenceSender()
.sendPresenceUpdate(venueInfo.getRoomID(), presence);
} catch (ECFException e) {
throw new CollaborationException(e);
}
}
}

View file

@ -0,0 +1,585 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.user;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.JAXB;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.core.user.User;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresence.Type;
import org.eclipse.ecf.presence.Presence;
import org.eclipse.ecf.presence.roster.IRoster;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.roster.IRosterGroup;
import org.eclipse.ecf.presence.roster.IRosterItem;
import org.eclipse.ecf.presence.roster.IRosterListener;
import org.eclipse.ecf.presence.search.ICriteria;
import org.eclipse.ecf.presence.search.ICriterion;
import org.eclipse.ecf.presence.search.IResult;
import org.eclipse.ecf.presence.search.ISearch;
import org.eclipse.ecf.presence.search.IUserSearchManager;
import org.eclipse.ecf.presence.search.UserSearchException;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.localization.exception.LocalizationOpFailedException;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.event.UserNicknameChangedEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.LocalGroups.LocalGroup;
/**
*
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 29, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class ContactsManager {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ContactsManager.class);
private final Job storeLocalGroupsJob = new Job("Storing Local Groups") {
@Override
protected IStatus run(IProgressMonitor monitor) {
IPathManager pm = PathManagerFactory.getPathManager();
LocalizationContext context = pm.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = PathManagerFactory.getPathManager()
.getLocalizationFile(
context,
"collaboration" + File.separator
+ "localGroups.xml");
LocalGroups obj;
synchronized (localGroups) {
obj = new LocalGroups(localGroups);
}
JAXB.marshal(obj, file.getFile());
try {
file.save();
} catch (LocalizationOpFailedException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
}
return org.eclipse.core.runtime.Status.OK_STATUS;
}
};
private final CollaborationConnection connection;
private List<LocalGroup> localGroups;
private Map<String, String> localAliases;
private Set<LocalGroupListener> groupListeners = new HashSet<LocalGroupListener>();
public ContactsManager(CollaborationConnection connection) {
this.connection = connection;
localAliases = UserIdWrapper.readAliasMap();
applyLocalAliases(getRoster());
initLocalGroups();
connection.getRosterManager().addRosterListener(new IRosterListener() {
@Override
public void handleRosterUpdate(IRoster roster,
IRosterItem changedValue) {
}
@Override
public void handleRosterEntryRemove(IRosterEntry entry) {
}
@Override
public void handleRosterEntryAdd(IRosterEntry entry) {
applyLocalAliases(entry);
}
});
}
private void applyLocalAliases(IRosterItem item) {
if (item instanceof IRosterEntry) {
IRosterEntry entry = (IRosterEntry) item;
IUser user = entry.getUser();
String alias = localAliases.get(getUserId(user));
if (alias != null && user instanceof User) {
((User) user).setNickname(alias);
}
} else if (item instanceof IRosterGroup) {
Collection<?> entries = ((IRosterGroup) item).getEntries();
synchronized (entries) {
entries = new ArrayList<Object>(entries);
}
for (Object o : entries) {
applyLocalAliases((IRosterItem) o);
}
} else if (item instanceof IRoster) {
Collection<?> entries = ((IRoster) item).getItems();
synchronized (entries) {
entries = new ArrayList<Object>(entries);
}
for (Object o : entries) {
applyLocalAliases((IRosterItem) o);
}
}
}
private void initLocalGroups() {
storeLocalGroupsJob.setSystem(true);
IPathManager pm = PathManagerFactory.getPathManager();
LocalizationContext context = pm.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = PathManagerFactory.getPathManager()
.getLocalizationFile(context,
"collaboration" + File.separator + "localGroups.xml");
if (file.exists()) {
this.localGroups = JAXB
.unmarshal(file.getFile(), LocalGroups.class).getGroups();
}
if (this.localGroups == null) {
this.localGroups = new ArrayList<LocalGroup>();
}
for (LocalGroup group : localGroups) {
group.setManager(this);
}
}
public List<LocalGroup> getLocalGroups() {
synchronized (this.localGroups) {
return new ArrayList<LocalGroup>(this.localGroups);
}
}
public void addToLocalGroup(String groupName, IUser user) {
synchronized (this.localGroups) {
LocalGroup group = createLocalGroup(groupName);
String userId = getUserId(user);
List<String> userNames = group.getUserNames();
if (!userNames.contains(userId)) {
List<IUser> users = group.getUsers();
group.getUserNames().add(userId);
users.add(user);
}
IRosterEntry entry = getRosterEntry(user);
if (entry == null || entry.getGroups().isEmpty()) {
// In order to get presence for a user they must be in the
// roster, we can add them to the roster by either subscribing
// to them using presence or adding them to the roster,
// subscribing to the presence will not set the name coreectly
// so we use the roster add method.
try {
// IPresence presence = new Presence(Type.SUBSCRIBE);
// connection.getRosterManager().getPresenceSender()
// .sendPresenceUpdate(user.getID(), presence);
connection.getRosterManager().getRosterSubscriptionSender()
.sendRosterAdd(userId, user.getName(), null);
} catch (ECFException e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
}
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.userAdded(group, user);
}
}
storeLocalGroupsJob.schedule();
}
public void deleteFromLocalGroup(String groupName, IUser user) {
synchronized (localGroups) {
Iterator<LocalGroup> it = localGroups.iterator();
while (it.hasNext()) {
LocalGroup group = it.next();
if (group.getName().equals(groupName)) {
group.getUsers().remove(user);
group.getUserNames().remove(getUserId(user));
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.userDeleted(group, user);
}
break;
}
}
if (getLocalGroups(user).isEmpty()) {
// if the user is in no local groups and no roster groups remove
// them from our roster.
IRosterEntry entry = getRosterEntry(user);
if (entry != null && entry.getGroups().isEmpty()) {
IPresence presence = new Presence(Type.UNSUBSCRIBE);
try {
connection.getRosterManager().getPresenceSender()
.sendPresenceUpdate(user.getID(), presence);
} catch (ECFException e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
}
}
storeLocalGroupsJob.schedule();
}
}
public LocalGroup createLocalGroup(String groupName) {
synchronized (localGroups) {
for (LocalGroup group : this.localGroups) {
if (groupName.equals(group.getName())) {
return group;
}
}
LocalGroup group = new LocalGroup(groupName);
group.setManager(this);
localGroups.add(group);
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.groupCreated(group);
}
storeLocalGroupsJob.schedule();
return group;
}
}
public void deleteLocalGroup(String groupName) {
synchronized (localGroups) {
Iterator<LocalGroup> it = this.localGroups.iterator();
while (it.hasNext()) {
LocalGroup group = it.next();
if (groupName.equals(group.getName())) {
ArrayList<IUser> users = new ArrayList<IUser>(
group.getUsers());
for (IUser user : users) {
deleteFromLocalGroup(groupName, user);
}
it.remove();
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.groupDeleted(group);
}
}
}
}
storeLocalGroupsJob.schedule();
}
public void renameLocalGroup(String oldName, String newName) {
synchronized (localGroups) {
for (LocalGroup group : localGroups) {
if (oldName.equals(group.getName())) {
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.groupDeleted(group);
}
group.setName(newName);
for (LocalGroupListener listener : getSafeGroupListeners()) {
listener.groupCreated(group);
}
}
}
}
storeLocalGroupsJob.schedule();
}
public List<LocalGroup> getLocalGroups(IUser user) {
List<LocalGroup> results = new ArrayList<LocalGroup>();
synchronized (localGroups) {
for (LocalGroup group : localGroups) {
for (String userName : group.getUserNames()) {
if (getUserId(user).equals(userName)) {
results.add(group);
break;
}
}
}
}
return results;
}
public void setNickname(IUser user, String nickname) {
synchronized (localAliases) {
localAliases.put(getUserId(user), nickname);
try {
UserIdWrapper.saveAliasMap(localAliases);
} catch (LocalizationOpFailedException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
}
applyLocalAliases(getRoster());
connection.postEvent(new UserNicknameChangedEvent(user, nickname));
}
}
/**
* Attempt to find a good displayable name for a user, first it looks in the
* local alias file, then it searches the roster to see if the server has
* provided a name, finally if no name is found it will attempt to use the
* username.
*
* @param user
* @return
*/
public String getDisplayName(IUser user) {
String alias = localAliases.get(getUserId(user));
if (alias == null) {
// at this point try to get the user from roster;
IUser rosterUser = null;
if (user.getID() != null) {
rosterUser = getUser(user.getID());
}
if (rosterUser != null) {
user = rosterUser;
}
alias = user.getNickname();
if (alias == null) {
alias = user.getName();
if (alias == null) {
alias = user.getID().getName();
}
}
if (alias.contains("@")) {
alias = Tools.parseName(alias);
}
}
return alias;
}
public IUser getUser(ID id) {
return getUser(getUserId(id));
}
public IUser getUser(String userId) {
userId = normalizeId(userId);
IRosterEntry entry = searchRoster(getRoster(), userId);
if (entry == null) {
return null;
}
return entry.getUser();
}
public IRosterEntry getRosterEntry(IUser user) {
return searchRoster(user);
}
public IPresence getPresence(IUser user) {
IRosterEntry entry = searchRoster(user);
if (entry == null) {
return new Presence(Type.UNKNOWN);
}
return entry.getPresence();
}
/**
* Used by local groups to make sure all local group items are in the
* roster.
*
* @param name
* @return
*/
protected IUser findAndAddUser(String name) {
name = normalizeId(name);
IUser user = null;
IRosterEntry entry = searchRoster(getRoster(), name);
if (entry != null) {
user = entry.getUser();
}
if (user == null) {
user = findUser(name);
if (user != null) {
try {
connection
.getRosterManager()
.getRosterSubscriptionSender()
.sendRosterAdd(getUserId(user), user.getName(),
null);
} catch (ECFException e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
}
}
return user;
}
private IUser findUser(String name) {
IUserSearchManager searchManager = connection
.getPresenceContainerAdapter().getUserSearchManager();
ICriterion criterion = searchManager.createRestriction().eq("Username",
Tools.parseName(name));
ICriteria criteria = searchManager.createCriteria();
criteria.add(criterion);
try {
ISearch search = searchManager.search(criteria);
for (Object result : search.getResultList().getResults()) {
if (result instanceof IResult) {
IUser user = ((IResult) result).getUser();
String alias = localAliases.get(getUserId(user));
if (alias != null && user instanceof User) {
((User) user).setNickname(alias);
}
return user;
}
}
} catch (UserSearchException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
}
return null;
}
private IRoster getRoster() {
return connection.getRosterManager().getRoster();
}
/**
* given a user return username@host.
*
* @param user
* @return
*/
private String getUserId(IUser user) {
if (user.getID() == null) {
return normalizeId(user.toString());
}
return getUserId(user.getID());
}
/**
* given a user ID return username@host.
*
* @param id
* @return
*/
private String getUserId(ID id) {
return normalizeId(id.getName());
}
private String normalizeId(String userId) {
String name = Tools.parseName(userId);
String hostname = Tools.parseHost(userId);
hostname = IDConverter.normalizeHostname(hostname);
return name + "@" + hostname;
}
private IRosterEntry searchRoster(IUser user) {
String userId = getUserId(user);
return searchRoster(getRoster(), userId);
}
private IRosterEntry searchRoster(IRosterItem item, String userName) {
if (item instanceof IRosterEntry) {
IRosterEntry entry = (IRosterEntry) item;
if (userName.equals(getUserId(entry.getUser()))) {
return entry;
}
} else if (item instanceof IRosterGroup) {
Collection<?> entries = ((IRosterGroup) item).getEntries();
synchronized (entries) {
entries = new ArrayList<Object>(entries);
}
for (Object o : entries) {
IRosterEntry entry = searchRoster((IRosterItem) o, userName);
if (entry != null) {
return entry;
}
}
} else if (item instanceof IRoster) {
Collection<?> entries = ((IRoster) item).getItems();
synchronized (entries) {
entries = new ArrayList<Object>(entries);
}
for (Object o : entries) {
IRosterEntry entry = searchRoster((IRosterItem) o, userName);
if (entry != null) {
return entry;
}
}
} else {
throw new IllegalStateException("Unexpected Roster entry: "
+ item.getClass().getSimpleName());
}
return null;
}
public void addLocalGroupListener(LocalGroupListener listener) {
synchronized (groupListeners) {
groupListeners.add(listener);
}
}
public void removeLocalGroupListener(LocalGroupListener listener) {
synchronized (groupListeners) {
groupListeners.remove(listener);
}
}
protected Set<LocalGroupListener> getSafeGroupListeners() {
Set<LocalGroupListener> safeSet = new HashSet<LocalGroupListener>();
synchronized (groupListeners) {
safeSet.addAll(groupListeners);
}
return safeSet;
}
public static interface LocalGroupListener {
public void groupCreated(LocalGroup group);
public void groupDeleted(LocalGroup group);
public void userAdded(LocalGroup group, IUser user);
public void userDeleted(LocalGroup group, IUser user);
}
}

View file

@ -0,0 +1,90 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.user;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 28, 2012 jkorman Initial creation
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
public class IDConverter {
private static final String CONF_ID = "conference.";
/**
*
* @param user
* @return
*/
public static UserId convertFrom(org.eclipse.ecf.core.identity.ID id) {
String name = Tools.parseName(id.getName());
String host = Tools.parseHost(id.getName());
String rsc = Tools.parseResource(id.getName());
UserId uid = new UserId(name, host, rsc);
uid.setId(id);
return uid;
}
/**
*
* @param user
* @return
*/
public static UserId convertFrom(org.eclipse.ecf.core.user.IUser user) {
UserId retVal = null;
if (user instanceof UserId) {
retVal = (UserId) user;
} else {
String name = Tools.parseName(user.getID().getName());
String host = Tools.parseHost(user.getID().getName());
retVal = new UserId(name, host);
retVal.setId(user.getID());
if (user.getNickname() != null) {
retVal.setAlias(user.getNickname());
} else {
retVal.setAlias(user.getName());
}
}
return retVal;
}
public static String normalizeHostname(String hostname) {
if (hostname.startsWith(CONF_ID)) {
return hostname.substring(CONF_ID.length());
}
return hostname;
}
}

View file

@ -0,0 +1,133 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.user;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.eclipse.ecf.core.user.IUser;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 2, 2012 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "LocalGroups")
public class LocalGroups {
@XmlElement(name = "group")
private List<LocalGroup> groups;
public LocalGroups() {
}
public LocalGroups(List<LocalGroup> groups) {
this.groups = new ArrayList<LocalGroup>(groups);
}
public List<LocalGroup> getGroups() {
return groups;
}
public void setGroups(List<LocalGroup> groups) {
this.groups = groups;
}
@XmlAccessorType(XmlAccessType.NONE)
public static class LocalGroup {
@XmlAttribute
private String name;
@XmlElement(name = "user")
private List<String> userNames;
@XmlTransient
private ContactsManager manager;
@XmlTransient
private List<IUser> users;
public LocalGroup() {
}
public LocalGroup(String name) {
this.name = name;
this.userNames = new ArrayList<String>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getUserNames() {
if (userNames == null) {
userNames = new ArrayList<String>();
}
return userNames;
}
public void setUserNames(List<String> userNames) {
this.userNames = userNames;
}
public synchronized List<IUser> getUsers() {
if (users == null) {
users = new ArrayList<IUser>();
for (String userName : userNames) {
IUser user = manager.findAndAddUser(userName);
if (user != null) {
users.add(user);
}
}
}
return users;
}
public void setManager(ContactsManager manager) {
this.manager = manager;
}
}
}

View file

@ -0,0 +1,279 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.comm.provider.user;
import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.user.IUser;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 24, 2012 jkorman Initial creation
* Apr 18, 2012 njensen Major refactor
*
* </pre>
*
* @author jkorman
* @version 1.0
*/
@DynamicSerialize
@XmlRootElement(name = "userId")
public class UserId implements IQualifiedID, IUser {
@DynamicSerializeElement
protected String name;
@DynamicSerializeElement
protected String host;
@DynamicSerializeElement
protected String resource;
@DynamicSerializeElement
protected String alias;
private ID id;
public UserId() {
}
/**
*
* @param userName
* @param hostName
*/
public UserId(String userName, String hostName) {
this(userName, hostName, null);
}
/**
*
* @param userName
* @param hostName
* @param resourceName
*/
public UserId(String userName, String hostName, String resource) {
this(userName, hostName, resource, null);
}
public UserId(String userName, String hostName, String resource,
String alias) {
this.name = userName;
setHost(hostName);
this.resource = resource;
this.alias = alias;
}
/**
* @param userName
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#setUserName(java.lang.String)
*/
@Override
public void setName(String userName) {
name = userName;
}
/**
* @return The user name associated with this id.
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#getUserName()
*/
@Override
public String getName() {
return name;
}
/**
*
* @param hostName
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#setHostName(java.lang.String)
*/
@Override
public void setHost(String hostname) {
host = IDConverter.normalizeHostname(hostname);
}
/**
*
* @return The host name associated with this id.
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#getHostName()
*/
@Override
public String getHost() {
return host;
}
/**
*
* @param resourceName
* The resource associated with this id.
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#setResourceName(java.lang.String)
*/
@Override
public void setResource(String resourceName) {
resource = resourceName;
}
/**
*
* @return The resource associated with this id.
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#getResource()
*/
@Override
public String getResource() {
return resource;
}
/**
*
* @see com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID#getFQName()
*/
@Override
public String getFQName() {
StringBuilder sb = new StringBuilder(name);
sb.append("@");
sb.append(host);
sb.append("/");
if (resource != null) {
sb.append(resource);
} else {
// TODO need a better way around this ECF/XMPP flaw that is
// requiring a resource for peerToPeer to go through
sb.append("resource");
}
return sb.toString();
}
public String getAlias() {
if (alias == null || alias.isEmpty()) {
return name;
}
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
@Override
public String toString() {
return this.getFQName();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((host == null) ? 0 : host.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
+ ((resource == null) ? 0 : resource.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof UserId))
return false;
UserId other = (UserId) obj;
if (host == null) {
if (other.host != null)
return false;
} else if (!host.equals(other.host))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (resource == null) {
if (other.resource != null)
return false;
} else if (!resource.equals(other.resource))
return false;
return true;
}
@Override
public Object getAdapter(Class adapter) {
return null;
}
@Override
public String getNickname() {
return alias;
}
@Override
public Map getProperties() {
return null;
}
@Override
public ID getID() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(ID id) {
this.id = id;
}
/**
* Checks if it is the same user. Does not check the resource.
*
* @param id
* the string id to compare against
* @return if it is the same user
*/
public boolean isSameUser(String id) {
boolean result = false;
String name = Tools.parseName(id);
String host = Tools.parseHost(id);
if (name != null && host != null) {
if (this.name.equals(name) && this.host.equals(host)) {
result = true;
}
}
return result;
}
}

Some files were not shown because too many files have changed in this diff Show more