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 }