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