001    /*
002     * $Id: HydraDataSource.java,v 1.12 2012/02/19 17:35:45 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.data;
032    
033    import java.io.File;
034    import java.rmi.RemoteException;
035    import java.util.ArrayList;
036    import java.util.Hashtable;
037    import java.util.List;
038    
039    import ucar.unidata.data.DataCategory;
040    import ucar.unidata.data.DataChoice;
041    import ucar.unidata.data.DataSelection;
042    import ucar.unidata.data.DataSourceDescriptor;
043    import ucar.unidata.data.DataSourceImpl;
044    import ucar.unidata.util.WrapperException;
045    import visad.Data;
046    import visad.VisADException;
047    
048    public class HydraDataSource extends DataSourceImpl  {
049    
050        /** List of sources files */
051        protected final List sources = new ArrayList();
052    
053        public static String request;
054    
055        /** List of sources files */
056        protected List adapters;
057    
058        /** for unpersistence */
059        protected String oldSourceFromBundles;
060    
061        /**
062         * Default constructor
063         */
064        public HydraDataSource() {}
065    
066        /**
067         * Create a HydraDataSource
068         *
069         * @param descriptor The datasource descriptor
070         * @param newSources List of files or urls
071         * @param description The long name
072         * @param properties properties
073         *
074         * @throws VisADException  couldn't create the data
075         */
076        public HydraDataSource(DataSourceDescriptor descriptor, List newSources,
077                               String description, Hashtable properties) 
078                throws VisADException {
079    
080            super(descriptor, "Hydra", "Hydra", properties);
081    /*
082            System.out.println("HydraDataSource:");
083            System.out.println("    descriptor=" + descriptor);
084            System.out.println("    sources=" + newSources);
085            System.out.println("    description=" + description);
086            System.out.println("    properties=" + properties);
087    */
088            if (newSources != null)
089                sources.addAll(newSources);
090        }
091    
092        /**
093         * Can this data source save its dat to local disk
094         *
095         * @return can save to local disk
096         */
097        public boolean canSaveDataToLocalDisk() {
098            return !isFileBased() && (getProperty(PROP_SERVICE_HTTP) != null);
099        }
100    
101        /**
102         * Are we getting data from a file or from server
103         * 
104         * @return is the data from files
105         */
106        protected boolean isFileBased() {
107            if (sources.isEmpty())
108                return false;
109    
110            return (new File(sources.get(0).toString())).exists();
111        }
112    
113        /**
114         * This is called when the CacheManager detects the need ot clear memory.
115         * It is intended to be overwritten by derived classes that are holding cached
116         * data that is not in the normal putCache facilities provided by this class
117         * since that data is actually managed by the CacheManager
118         */
119        public void clearCachedData() {
120            super.clearCachedData();
121        }
122    
123        /**
124         * Create, if needed, and return the list of adapters.
125         * Will return null if there are no valid adapters.
126         *
127         * @return List of adapters or null
128         */
129        protected List getAdapters() {
130            if ((adapters == null) || (adapters.size() == 0)) {
131                try {
132                    makeAdapters(sources);
133                } catch (Exception exc) {
134                    setInError(true);
135                    throw new WrapperException(exc);
136                }
137            }
138            if (adapters.size() == 0) {
139                adapters = null;
140            }
141            return adapters;
142        }
143    
144        /**
145         * Make the adapters for the given list of files
146         *
147         * @param files Data files
148         *
149         * @throws Exception When bad things happen
150         */
151        private void makeAdapters(List files) throws Exception {
152            adapters = new ArrayList();
153        }
154    
155        /**
156         * Create the list of times associated with this DataSource.
157         * @return list of times.
158         */
159        protected List doMakeDateTimes() {
160            List times = new ArrayList();
161            return times;
162        }
163    
164    /*
165        public boolean canDoGeoSelection() {
166           return true;
167        }
168    */
169    
170        /**
171         * Get the data for the given DataChoice and selection criteria.
172         * @param dataChoice         DataChoice for selection
173         * @param category           DataCategory for the DataChoice (not used)
174         * @param subset             subsetting criteria
175         * @param requestProperties  extra request properties
176         * @return  the Data object for the request
177         *
178         * @throws RemoteException couldn't create a remote data object
179         * @throws VisADException  couldn't create the data
180         */
181        protected Data getDataInner(DataChoice dataChoice, DataCategory category,
182                                    DataSelection subset,
183                                    Hashtable requestProperties)
184                throws VisADException, RemoteException {
185            return null;
186        }
187    }