Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.impl / src / main / java / org / gvsig / fmap / geom / type / impl / DefaultGeometryType.java @ 40767

History | View | Annotate | Download (6.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
 
25
package org.gvsig.fmap.geom.type.impl;
26

    
27
import java.lang.reflect.Constructor;
28

    
29
import org.gvsig.fmap.geom.Geometry;
30
import org.gvsig.fmap.geom.GeometryManager;
31
import org.gvsig.fmap.geom.exception.CreateGeometryException;
32
import org.gvsig.fmap.geom.type.AbstractGeometryType;
33
import org.gvsig.fmap.geom.type.GeometryType;
34

    
35
/**
36
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
37
 */
38
public class DefaultGeometryType extends AbstractGeometryType {
39
        
40
        /** 
41
         * Geometry type name
42
         */
43
        private String name;
44
                
45
        /** Class that implements this class type */
46
        private Class geometryClass;
47
        
48
        /**
49
         * The type of the geometry. The type is an abstract representation
50
         * of the object (Point, Curve...) but it is not a concrete 
51
         * representation (Point2D, Point3D...). To do that comparation
52
         * the id field is used.
53
         */
54
        private int type;
55
        
56
        /**
57
         * The subtype of the geometry. The subtype represents a set of 
58
         * geometries with a dimensional relationship (2D, 3D, 2DM...)
59
         */
60
        private int subType;        
61
                
62
        /**
63
         * Super types of a geometry. e.g: the super type of an
64
         * arc is a curve, the super type of a circle is a surface...
65
         * The supertypes are defined in the ISO 19107 
66
         * 
67
         * @see <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26012"
68
         * >ISO 19107< /a>
69
         */
70
        private int[] superTypes = null;
71
        
72
        /**
73
     * Super SubTypes of a geometry. e.g: the super SubType of a
74
     * geometry 3D is a geometry 2D, because the 3D extends the
75
     * behavior of a geometry 2D
76
     */
77
        private int[] superSubTypes = null;
78
        
79
    private Constructor constructor;
80
    private final Object[] parameters = { this };
81

    
82
        /**
83
     * This constructor is used by the {@link GeometryManager} when it
84
     * register a new GeometryType. It has not be used from other
85
     * parts.
86
     * @param geomClass
87
     * Geometry class (e.g: Point2D.class)
88
     * @param name
89
     * Symbolic Geometry name that is used to persist the geometry type. In some
90
     * cases, it is better to use this name because the id can change for different
91
     * application executions.              
92
     * @param id
93
     * Geometry id  
94
     * @param typeName
95
     * The geometry type name
96
     * @param type
97
     * The geometry abstract type    
98
     * @param superTypes
99
     * The superTypes of the geometry type
100
     * @param superSubTypes
101
     * The superSubtypes of the geometry type      
102
     */
103
    public DefaultGeometryType(Class geomClass, String name, int type, int subType, 
104
        int[] superTypes, int[] superSubTypes) {
105
        this.geometryClass = geomClass;
106
        if (name == null) {
107
            this.name = geomClass.getName();
108
        } else {
109
            this.name = name;
110
        }
111
        this.type = type;   
112
        this.subType = subType;
113
        this.superTypes = superTypes;
114
        this.superSubTypes = superSubTypes;
115

    
116
        Class[] parameterTypes = { GeometryType.class };
117
        try {
118
            constructor = geometryClass.getConstructor(parameterTypes);
119
        } catch (NoSuchMethodException e) {
120
            throw new RuntimeException(
121
                "Error constructor of the geometry class " + geomClass
122
                    + " with one parameter of type GeometryType not found", e);
123
        }
124
    }        
125
        
126
        /**
127
         * This constructor is used by the {@link GeometryManager} when it
128
         * register a new GeometryType. It has not be used from other
129
         * parts.
130
         * @param geomClass
131
         * Geometry class (e.g: Point2D.class)
132
         * @param name
133
         * Symbolic Geometry name that is used to persist the geometry type. In some
134
         * cases, it is better to use this name because the id can change for different
135
         * application executions.                           
136
         * @param id
137
         * Geometry id        
138
         * @param typeName
139
         * The geometry type name
140
         * @param type
141
         * The geometry abstract type                        
142
         */
143
        public DefaultGeometryType(Class geomClass, String name, int type, int subType) {
144
                this(geomClass, name, type, subType, new int[0], new int[0]);
145
        }
146
        
147
        /**
148
         * This method creates a {@link Geometry} with the type specified 
149
         * by this GeometryType. The geometry has to have a constructor
150
         * without arguments.
151
         * 
152
         * @return A new geometry
153
         * @throws CreateGeometryException 
154
         */
155
        public Geometry create() throws CreateGeometryException{
156
                try {
157
            return (Geometry) constructor.newInstance(parameters);
158
                } catch (Exception e) {
159
                        throw new CreateGeometryException(type, subType, e);
160
                } 
161
        }
162
        
163
        public Class getGeometryClass() {
164
                return geometryClass;
165
        }
166
        
167
        public String getName() {
168
                return name;
169
        }
170

    
171
        public int getType() {
172
                return type;
173
        }
174

    
175
        public int getSubType() {
176
                return subType;
177
        }
178

    
179
    public boolean isTypeOf(int geometryType) {
180
        if (type == geometryType){
181
            return true;
182
        }
183
        for (int i=0 ; i<superTypes.length ; i++){
184
            if(superTypes[i] == geometryType){
185
                return true;
186
            }
187
        }
188
        return Geometry.TYPES.GEOMETRY == geometryType;
189
    }
190

    
191
    public boolean isSubTypeOf(int geometrySubType) {
192
        if (subType == geometrySubType){
193
            return true;
194
        }
195
        for (int i=0 ; i<superSubTypes.length ; i++){
196
            if(superSubTypes[i] == geometrySubType){
197
                return true;
198
            }
199
        }
200
        return false;
201
    }
202

    
203
}
204