    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_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    }