001 /* 002 * $Id: ServerInfo.java,v 1.16 2012/02/19 17:35:36 davep Exp $ 003 * 004 * This file is part of McIDAS-V 005 * 006 * Copyright 2007-2012 007 * Space Science and Engineering Center (SSEC) 008 * University of Wisconsin - Madison 009 * 1225 W. Dayton Street, Madison, WI 53706, USA 010 * https://www.ssec.wisc.edu/mcidas 011 * 012 * All Rights Reserved 013 * 014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 015 * some McIDAS-V source code is based on IDV and VisAD source code. 016 * 017 * McIDAS-V is free software; you can redistribute it and/or modify 018 * it under the terms of the GNU Lesser Public License as published by 019 * the Free Software Foundation; either version 3 of the License, or 020 * (at your option) any later version. 021 * 022 * McIDAS-V is distributed in the hope that it will be useful, 023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 025 * GNU Lesser Public License for more details. 026 * 027 * You should have received a copy of the GNU Lesser Public License 028 * along with this program. If not, see http://www.gnu.org/licenses. 029 */ 030 031 package edu.wisc.ssec.mcidasv.chooser; 032 033 034 import edu.wisc.ssec.mcidasv.*; 035 036 import java.util.ArrayList; 037 import java.util.List; 038 039 import org.w3c.dom.Document; 040 import org.w3c.dom.Element; 041 import org.w3c.dom.NodeList; 042 043 import ucar.unidata.idv.IntegratedDataViewer; 044 import ucar.unidata.idv.IdvResourceManager; 045 046 import ucar.unidata.idv.chooser.adde.AddeServer; 047 048 import ucar.unidata.xml.XmlResourceCollection; 049 import ucar.unidata.xml.XmlUtil; 050 051 052 /** 053 * Class ServerInfo Holds has methods for accessing 054 * the contents of servers.xml 055 */ 056 public class ServerInfo { 057 058 private IntegratedDataViewer myIdv; 059 060 /** tags */ 061 public static final String TAG_SERVER = "server"; 062 public static final String TAG_SERVERS = "servers"; 063 public static final String TAG_GROUP = "group"; 064 065 /** attributes */ 066 public static final String ATTR_ACTIVE = "active"; 067 public static final String ATTR_NAME = "name"; 068 public static final String ATTR_NAMES = "names"; 069 public static final String ATTR_USER = "user"; 070 public static final String ATTR_PROJ = "proj"; 071 public static final String ATTR_TYPE = "type"; 072 073 private XmlResourceCollection serversXRC; 074 private Document serversDocument; 075 private Element serversRoot; 076 077 private static String user = "idv"; 078 private static String proj = "0"; 079 080 private List typeList = new ArrayList(); 081 private List groups = new ArrayList(); 082 083 private List serverDescriptors = new ArrayList(); 084 085 private String[] defTypes = {"image", "point", "grid", "text", "nav"}; 086 087 /** 088 * Constructor 089 */ 090 public ServerInfo(IntegratedDataViewer idv, XmlResourceCollection servers) { 091 myIdv = idv; 092 serversXRC = servers; 093 094 if (serversXRC.hasWritableResource()) { 095 serversDocument = 096 serversXRC.getWritableDocument("<servers></servers>"); 097 serversRoot = 098 serversXRC.getWritableRoot("<servers></servers>"); 099 String tagName = serversRoot.getTagName(); 100 } 101 getServersFromXml(serversXRC); 102 } 103 104 105 /** 106 * getServersFromXml 107 * Read and parse servers.xml 108 * 109 * fill lists: 110 * typeList - type name Strings 111 */ 112 private void getServersFromXml(XmlResourceCollection servers) { 113 servers.clearCache(); 114 serverDescriptors.clear(); 115 if (serversXRC.hasWritableResource()) { 116 serversDocument = 117 serversXRC.getWritableDocument("<tabs></tabs>"); 118 serversRoot = 119 serversXRC.getWritableRoot("<tabs></tabs>"); 120 try { 121 Element root = serversRoot; 122 if (root == null) return; 123 // if ((user.equals("")) && (proj.equals(""))) { 124 if (serversRoot.hasAttribute(ATTR_USER)) 125 user = serversRoot.getAttribute(ATTR_USER); 126 if (serversRoot.hasAttribute(ATTR_PROJ)) 127 proj = serversRoot.getAttribute(ATTR_PROJ); 128 // } 129 List serverElements = XmlUtil.getElements(root, TAG_SERVER); 130 for (int serverIdx = 0; serverIdx < serverElements.size(); serverIdx++) { 131 Element serverElement = (Element) serverElements.get(serverIdx); 132 String nameServer = XmlUtil.getAttribute(serverElement, ATTR_NAME); 133 String activeServer = XmlUtil.getAttribute(serverElement, ATTR_ACTIVE); 134 List groupElements = XmlUtil.getElements(serverElement, TAG_GROUP); 135 for (int groupIdx = 0; groupIdx < groupElements.size(); groupIdx++) { 136 Element groupElement = (Element) groupElements.get(groupIdx); 137 String activeGroup = XmlUtil.getAttribute(groupElement, ATTR_ACTIVE); 138 String nameGroup = XmlUtil.getAttribute(groupElement, ATTR_NAMES); 139 String type = XmlUtil.getAttribute(groupElement, ATTR_TYPE); 140 if (!typeList.contains(type)) { 141 typeList.add(type); 142 } 143 ServerDescriptor sd = 144 new ServerDescriptor(type, nameServer, nameGroup, activeGroup); 145 serverDescriptors.add(sd); 146 } 147 } 148 } catch (Exception e) { 149 System.out.println("getServersFromXml e=" + e); 150 } 151 } 152 return; 153 } 154 155 /** 156 * getUser 157 * return userId, default="idv" 158 */ 159 public String getUser() { 160 return user; 161 } 162 163 /** 164 * getProj 165 * return project number, default="0" 166 */ 167 public String getProj() { 168 return proj; 169 } 170 171 public void setUserProj(String user, String proj) { 172 Element serverRoot = serversXRC.getWritableRoot("<tabs></tabs>"); 173 Document serverDocument = serversXRC.getWritableDocument("<tabs></tabs>"); 174 try { 175 serverRoot.setAttribute(ATTR_USER, user); 176 serverRoot.setAttribute(ATTR_PROJ, proj); 177 serversXRC.setWritableDocument(serverDocument, serverRoot); 178 serversXRC.writeWritable(); 179 } catch (Exception e) { 180 System.out.println("updateXml AddeServer.toXml e=" + e); 181 } 182 } 183 184 /** 185 * getServerTypes 186 * return List of type Strings 187 */ 188 public List getServerTypes() { 189 for (int i=0; i<defTypes.length; i++) { 190 if (!typeList.contains(defTypes[i])) typeList.add(defTypes[i]); 191 } 192 return typeList; 193 } 194 195 /** 196 * getServers 197 * input: type = data type 198 * all = boolean flag 199 * includeDuplicates = boolean flag 200 * return List of ServerDescriptors 201 */ 202 public List getServers(String type, boolean all, boolean includeDuplicates) { 203 init(); 204 List servers = new ArrayList(); 205 List sds = new ArrayList(); 206 groups = new ArrayList(); 207 for (int i=0; i<serverDescriptors.size(); i++) { 208 ServerDescriptor sd = (ServerDescriptor)serverDescriptors.get(i); 209 if (sd.isDataType(type)) { 210 String name = sd.getServerName(); 211 if (!all) { 212 if (!sd.getIsActive()) continue; 213 if (!includeDuplicates) { 214 if (servers.contains(name)) continue; 215 } 216 } 217 servers.add(name); 218 sds.add(sd); 219 groups.add(sd.getGroupName()); 220 } 221 } 222 return sds; 223 } 224 225 /** 226 * getServerNames 227 * input: type = data type 228 * all = boolean flag 229 * includeDuplicates = boolean flag 230 * return List of server name strings 231 */ 232 public List getServerNames(String type, boolean all, boolean includeDuplicates) { 233 if (serverDescriptors == null) init(); 234 List servers = new ArrayList(); 235 if (typeList.contains(type)) { 236 for (int i=0; i<serverDescriptors.size(); i++) { 237 ServerDescriptor sd = (ServerDescriptor)serverDescriptors.get(i); 238 if (sd.isDataType(type)) { 239 String name = sd.getServerName(); 240 if (!all) { 241 if (!sd.getIsActive()) continue; 242 if (!includeDuplicates) { 243 if (servers.contains(name)) continue; 244 } 245 } 246 servers.add(name); 247 } 248 } 249 } 250 return servers; 251 } 252 253 /** 254 * getAddeServers 255 * input: type = data type 256 * all = boolean flag 257 * includeDuplicates = boolean flag 258 * return List of server name strings 259 */ 260 public List getAddeServers(String type, boolean all, boolean includeDuplicates) { 261 if (serverDescriptors == null) init(); 262 List servers = new ArrayList(); 263 List names = new ArrayList(); 264 if (typeList.contains(type)) { 265 for (int i=0; i<serverDescriptors.size(); i++) { 266 ServerDescriptor sd = (ServerDescriptor)serverDescriptors.get(i); 267 if (sd.isDataType(type)) { 268 String name = sd.getServerName(); 269 if (!all) { 270 if (!sd.getIsActive()) continue; 271 } 272 if (!includeDuplicates) { 273 if (names.contains(name)) continue; 274 } 275 AddeServer as = new AddeServer(sd.getServerName()); 276 AddeServer.Group g = new AddeServer.Group(sd.getDataType(), sd.getGroupName(), ""); 277 g.setActive(sd.getIsActive()); 278 as.addGroup(g); 279 servers.add(as); 280 names.add(as.getName()); 281 } 282 } 283 } 284 return servers; 285 } 286 287 /** 288 * updateAddeServers(String type, boolean all, boolean includeDuplicates) { 289 * input: type = data type 290 * all = boolean flag 291 * includeDuplicates = boolean flag 292 * return List of server name strings 293 */ 294 public List updateAddeServers(String type, boolean all, boolean includeDuplicates) { 295 init(); 296 return getAddeServers(type, all, includeDuplicates); 297 } 298 299 /** 300 * init 301 * read servers.xml and initialize all Lists 302 */ 303 private boolean init() { 304 serversXRC = 305 myIdv.getResourceManager().getXmlResources( 306 IdvResourceManager.RSC_ADDESERVER); 307 getServersFromXml(serversXRC); 308 if (serverDescriptors == null) return false; 309 return true; 310 } 311 312 /** 313 * getGroups - return all groups for a given data type 314 * return List of group name Strings 315 */ 316 public List getGroups(String type) { 317 init(); 318 getServers(type, false, true); 319 return groups; 320 } 321 322 323 /** 324 * addServers to servers.xml 325 * input: type = data type 326 * serverList = alternating strings: name1, group1, name2, group2, etc. 327 */ 328 public void addServers(IntegratedDataViewer idv, List serverList) { 329 int num = serverList.size(); 330 List addeServers = new ArrayList(); 331 if (num > 0) { 332 try { 333 for (int i=0; i<num; i++) { 334 ServerDescriptor sd = (ServerDescriptor) serverList.get(i); 335 String servName = sd.getServerName(); 336 AddeServer as = new AddeServer(sd.getServerName()); 337 AddeServer.Group g = new AddeServer.Group(sd.getDataType(), sd.getGroupName(), ""); 338 g.setActive(sd.getIsActive()); 339 as.addGroup(g); 340 addeServers.add(as); 341 } 342 } catch (Exception e) { 343 System.out.println("addServers e=" + e); 344 }; 345 } 346 List serversFinal = AddeServer.coalesce(addeServers); 347 348 XmlResourceCollection serverCollection = 349 idv.getResourceManager().getXmlResources( 350 IdvResourceManager.RSC_ADDESERVER); 351 Element serverRoot = serverCollection.getWritableRoot("<tabs></tabs>"); 352 Document serverDocument = serverCollection.getWritableDocument("<tabs></tabs>"); 353 try { 354 Element serversEle = AddeServer.toXml(serversFinal, false); 355 serverCollection.setWritableDocument(serverDocument, serversEle); 356 serverCollection.writeWritable(); 357 } catch (Exception e) { 358 System.out.println("AddeServer.toXml e=" + e); 359 } 360 } 361 362 /** 363 * Clear servers.xml 364 */ 365 public void clear(XmlResourceCollection serversXRC) { 366 List typeElements = XmlUtil.getElements(serversRoot, TAG_SERVER); 367 for (int typeIdx = 0; typeIdx < typeElements.size(); typeIdx++) { 368 Element typeElement = (Element) typeElements.get(typeIdx); 369 XmlUtil.removeChildren(typeElement); 370 } 371 try { 372 serversXRC.writeWritable(); 373 } catch (Exception e) { 374 } 375 serversXRC.setWritableDocument(serversDocument, serversRoot); 376 } 377 }