001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/ct/DomainFlags.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/exse/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 It has been implemented within SEAGIS - An OpenSource implementation of OpenGIS specification
012 (C) 2001, Institut de Recherche pour le D�veloppement (http://sourceforge.net/projects/seagis/)
013 SEAGIS Contacts: Surveillance de l'Environnement Assist�e par Satellite
014 Institut de Recherche pour le D�veloppement / US-Espace
015 mailto:seasnet@teledetection.fr
016
017
018 This library is free software; you can redistribute it and/or
019 modify it under the terms of the GNU Lesser General Public
020 License as published by the Free Software Foundation; either
021 version 2.1 of the License, or (at your option) any later version.
022
023 This library is distributed in the hope that it will be useful,
024 but WITHOUT ANY WARRANTY; without even the implied warranty of
025 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
026 Lesser General Public License for more details.
027
028 You should have received a copy of the GNU Lesser General Public
029 License along with this library; if not, write to the Free Software
030 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
031
032 Contact:
033
034 Andreas Poth
035 lat/lon GmbH
036 Aennchenstr. 19
037 53115 Bonn
038 Germany
039 E-Mail: poth@lat-lon.de
040
041 Klaus Greve
042 Department of Geography
043 University of Bonn
044 Meckenheimer Allee 166
045 53115 Bonn
046 Germany
047 E-Mail: klaus.greve@uni-bonn.de
048
049
050 ---------------------------------------------------------------------------*/
051 package org.deegree.model.csct.ct;
052
053 // OpenGIS dependencies
054 import java.io.ObjectStreamException;
055 import java.util.Locale;
056 import java.util.NoSuchElementException;
057
058 import javax.media.jai.EnumeratedParameter;
059
060 import org.deegree.model.csct.resources.XArray;
061 import org.deegree.model.csct.resources.css.ResourceKeys;
062 import org.deegree.model.csct.resources.css.Resources;
063
064 /**
065 * Flags indicating parts of domain covered by a convex hull. These flags can be combined. For
066 * example, the enum <code>{@link #INSIDE}.or({@link #OUTSIDE})</code> means that some parts of
067 * the convex hull are inside the domain, and some parts of the convex hull are outside the domain.
068 *
069 * @version 1.00
070 * @author OpenGIS (www.opengis.org)
071 * @author Martin Desruisseaux
072 *
073 * @author last edited by: $Author: bezema $
074 *
075 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
076 *
077 * @see "org.opengis.ct.CT_DomainFlags"
078 */
079 public final class DomainFlags extends EnumeratedParameter {
080 /**
081 * Serial number for interoperability with different versions.
082 */
083 private static final long serialVersionUID = 6991557069252861278L;
084
085 /**
086 * Domain flags by value. Used to canonicalize after deserialization.
087 */
088 private static final DomainFlags[] ENUMS = new DomainFlags[8];
089
090 /**
091 * At least one point in a convex hull is inside the transform's domain.
092 */
093 public static final int CT_DF_Inside = 1;
094
095 /**
096 * At least one point in a convex hull is outside the transform's domain.
097 */
098 public static final int CT_DF_Outside = 2;
099
100 /**
101 * At least one point in a convex hull is not transformed continuously. As an example, consider
102 * a "Longitude_Rotation" transform which adjusts longitude coordinates to take account of a
103 * change in Prime Meridian. If the rotation is 5 degrees east, then the point (Lat=0,Lon=175)
104 * is not transformed continuously, since it is on the meridian line which will be split at
105 * +180/-180 degrees.
106 */
107 public static final int CT_DF_Discontinuous = 4;
108
109 /**
110 * Initialize {@link #ENUMS} during class loading. This code must be done before we initialize
111 * public fields.
112 */
113 static {
114 for ( int i = ENUMS.length; --i >= 0; ) {
115 String name = null;
116 switch ( i ) {
117 case 0:
118 name = "UNKNOW";
119 break;
120 case CT_DF_Inside:
121 name = "INSIDE";
122 break;
123 case CT_DF_Outside:
124 name = "OUTSIDE";
125 break;
126 case CT_DF_Discontinuous:
127 name = "DISCONTINUOUS";
128 break;
129 }
130 ENUMS[i] = new DomainFlags( name, i );
131 }
132 }
133
134 /**
135 * At least one point in a convex hull is inside the transform's domain.
136 *
137 * @see "org.opengis.ct.CT_DomainFlags#CT_DF_Inside"
138 */
139 public static final DomainFlags INSIDE = ENUMS[CT_DF_Inside];
140
141 /**
142 * At least one point in a convex hull is outside the transform's domain.
143 *
144 * @see "org.opengis.ct.CT_DomainFlags#CT_DF_Outside"
145 */
146 public static final DomainFlags OUTSIDE = ENUMS[CT_DF_Outside];
147
148 /**
149 * At least one point in a convex hull is not transformed continuously. As an example, consider
150 * a "Longitude_Rotation" transform which adjusts longitude coordinates to take account of a
151 * change in Prime Meridian. If the rotation is 5 degrees east, then the point (Lat=0,Lon=175)
152 * is not transformed continuously, since it is on the meridian line which will be split at
153 * +180/-180 degrees.
154 *
155 * @see "org.opengis.ct.CT_DomainFlags#CT_DF_Discontinuous"
156 */
157 public static final DomainFlags DISCONTINUOUS = ENUMS[CT_DF_Discontinuous];
158
159 /**
160 * Construct a new enum value.
161 */
162 private DomainFlags( final String name, final int value ) {
163 super( name, value );
164 }
165
166 /**
167 * Return the enum for the specified value. This method is provided for compatibility with
168 * {@link "org.opengis.ct.CT_DomainFlags"}.
169 *
170 * @param value
171 * The enum value.
172 * @return The enum for the specified value.
173 * @throws NoSuchElementException
174 * if there is no enum for the specified value.
175 */
176 public static DomainFlags getEnum( final int value )
177 throws NoSuchElementException {
178 if ( value >= 1 && value < ENUMS.length )
179 return ENUMS[value];
180 throw new NoSuchElementException( String.valueOf( value ) );
181 }
182
183 /**
184 * Returns enum's names in the specified locale. For example if this enum has value "3", then
185 * <code>getNames</code> returns an array of two elements: "Inside" and "Outside".
186 *
187 * @param locale
188 * The locale, or <code>null</code> for the current default locale.
189 * @return Enum's names in the specified locale (never <code>null</code>).
190 */
191 public String[] getNames( final Locale locale ) {
192 int count = 0;
193 int bits = getValue();
194 Resources resources = null;
195 final int[] nameKeys = { ResourceKeys.INSIDE, ResourceKeys.OUTSIDE,
196 ResourceKeys.DISCONTINUOUS };
197 final String[] names = new String[nameKeys.length];
198 for ( int i = 0; i < nameKeys.length; i++ ) {
199 if ( ( bits & 1 ) != 0 ) {
200 if ( resources == null )
201 resources = Resources.getResources( locale );
202 names[count++] = resources.getString( nameKeys[i] );
203 }
204 bits >>>= 1;
205 }
206 return (String[]) XArray.resize( names, count );
207 }
208
209 /**
210 * Returns a combination of two domain flags. This is equivalent to
211 * <code>getEnum(this.getValue() | flags.getValue())</code>.
212 *
213 * @param flags
214 * @return a combination of two domain flags. This is equivalent to
215 * <code>getEnum(this.getValue() | flags.getValue())</code>.
216 */
217 public DomainFlags or( final DomainFlags flags ) {
218 return getEnum( getValue() | flags.getValue() );
219 }
220
221 /**
222 * Use a single instance of {@link DomainFlags} after deserialization. It allow client code to
223 * test <code>enum1==enum2</code> instead of <code>enum1.equals(enum2)</code>.
224 *
225 * @return A single instance of this enum.
226 * @throws ObjectStreamException
227 * is deserialization failed.
228 */
229 private Object readResolve() {
230 final int value = getValue();
231 if ( value >= 0 && value < ENUMS.length ) {
232 return ENUMS[value]; // Canonicalize
233 }
234 return ENUMS[0]; // Collapse unknow value to a single canonical one
235 }
236 }