001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/model/coverage/grid/AbstractGridCoverageWriter.java $
002    /*----------------------------------------------------------------------------
003     This file is part of deegree, http://deegree.org/
004     Copyright (C) 2001-2009 by:
005       Department of Geography, University of Bonn
006     and
007       lat/lon GmbH
008    
009     This library is free software; you can redistribute it and/or modify it under
010     the terms of the GNU Lesser General Public License as published by the Free
011     Software Foundation; either version 2.1 of the License, or (at your option)
012     any later version.
013     This library is distributed in the hope that it will be useful, but WITHOUT
014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016     details.
017     You should have received a copy of the GNU Lesser General Public License
018     along with this library; if not, write to the Free Software Foundation, Inc.,
019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020    
021     Contact information:
022    
023     lat/lon GmbH
024     Aennchenstr. 19, 53177 Bonn
025     Germany
026     http://lat-lon.de/
027    
028     Department of Geography, University of Bonn
029     Prof. Dr. Klaus Greve
030     Postfach 1147, 53001 Bonn
031     Germany
032     http://www.geographie.uni-bonn.de/deegree/
033    
034     e-mail: info@deegree.org
035    ----------------------------------------------------------------------------*/
036    package org.deegree.model.coverage.grid;
037    
038    import java.io.IOException;
039    import java.util.HashMap;
040    import java.util.Map;
041    
042    /**
043     * @version $Revision: 18195 $
044     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
045     * @author last edited by: $Author: mschneider $
046     *
047     * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
048     *
049     * @since 2.0
050     */
051    
052    public abstract class AbstractGridCoverageWriter implements GridCoverageWriter {
053    
054        protected Object destination = null;
055    
056        protected Map<String, Object> metadata = new HashMap<String, Object>();
057    
058        private String[] subNames = null;
059    
060        private String currentSubname = null;
061    
062        protected Format format = null;
063    
064        /**
065         * @param destination
066         * @param metadata
067         * @param subNames
068         * @param currentSubname
069         * @param format
070         */
071        public AbstractGridCoverageWriter( Object destination, Map<String, Object> metadata, String[] subNames,
072                                           String currentSubname, Format format ) {
073            this.destination = destination;
074            this.metadata = metadata;
075            this.subNames = subNames;
076            this.currentSubname = currentSubname;
077            this.format = format;
078        }
079    
080        /**
081         * Returns the format handled by this <code>GridCoverageWriter</code>.
082         */
083        public Format getFormat() {
084            return format;
085        }
086    
087        /**
088         * Returns the output destination. This is the object passed to the !unknown! method. It can be a
089         * {@link java.lang.String}, an {@link java.io.OutputStream}, a
090         * {@link java.nio.channels.FileChannel}, etc.
091         */
092        public Object getDestination() {
093            return destination;
094        }
095    
096        /**
097         * Returns the list of metadata keywords associated with the {@linkplain #getDestination output
098         * destination} as a whole (not associated with any particular grid coverage). If no metadata is
099         * allowed, the array will be empty.
100         *
101         * @return The list of metadata keywords for the output destination.
102         *
103         * @revisit This javadoc may not apply thats well in the iterator scheme.
104         */
105        public String[] getMetadataNames() {
106            return metadata.keySet().toArray( new String[metadata.size()] );
107        }
108    
109        /**
110         * Retrieve the metadata value for a given metadata name.
111         *
112         * @param name
113         *            Metadata keyword for which to retrieve metadata.
114         * @return The metadata value for the given metadata name. Should be one of the name returned by
115         *         {@link #getMetadataNames}.
116         * @throws IOException
117         *             if an error occurs during reading.
118         * @throws MetadataNameNotFoundException
119         *             if there is no value for the specified metadata name.
120         *
121         * @revisit This javadoc may not apply thats well in the iterator scheme.
122         */
123        public Object getMetadataValue( String name )
124                                throws IOException, MetadataNameNotFoundException {
125            return metadata.get( name );
126        }
127    
128        /**
129         * Sets the metadata value for a given metadata name.
130         *
131         * @param name
132         *            Metadata keyword for which to set the metadata.
133         * @param value
134         *            The metadata value for the given metadata name.
135         * @throws IOException
136         *             if an error occurs during writing.
137         * @throws MetadataNameNotFoundException
138         *             if the specified metadata name is not handled for this format.
139         *
140         * @revisit This javadoc may not apply thats well in the iterator scheme.
141         */
142        public void setMetadataValue( String name, String value )
143                                throws IOException, MetadataNameNotFoundException {
144            metadata.put( name, value );
145        }
146    
147        /**
148         * Retrieve the list of grid coverages contained within the {@linkplain #getDestination() input
149         * source}. Each grid can have a different coordinate system, number of dimensions and grid
150         * geometry. For example, a HDF-EOS file (GRID.HDF) contains 6 grid coverages each having a
151         * different projection. An empty array will be returned if no sub names exist.
152         *
153         * @return The list of grid coverages contained within the input source.
154         * @throws IOException
155         *             if an error occurs during reading.
156         *
157         * @revisit The javadoc should also be more explicit about hierarchical format. Should the names
158         *          be returned as paths? Explain what to return if the GridCoverage are accessible by
159         *          index only. A proposal is to name them "grid1", "grid2", etc.
160         */
161        public String[] listSubNames()
162                                throws IOException {
163            return subNames;
164        }
165    
166        /**
167         * Returns the name for the next grid coverage to be read from the
168         * {@linkplain #getDestination() output destination}.
169         *
170         * @throws IOException
171         *             if an error occurs during reading.
172         * @revisit Do we need a special method for that, or should it be a metadata?
173         */
174        public String getCurrentSubname()
175                                throws IOException {
176            return currentSubname;
177        }
178    
179        /**
180         * Set the name for the next grid coverage to GridCoverageWriter.write(GridCoverage,
181         * GeneralParameterValue[]) within the{@linkplain #getDestination output destination}. The
182         * subname can been fetch later at reading time.
183         *
184         * @throws IOException
185         *             if an error occurs during writing.
186         * @revisit Do we need a special method for that, or should it be a metadata?
187         */
188        public void setCurrentSubname( String name )
189                                throws IOException {
190            currentSubname = name;
191        }
192    
193    }