Revision 447 org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig2_1_0/vectorial/featurestore.py

View differences:

featurestore.py
1 1

  
2
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore
3 2

  
4
class FeatureStore(DefaultFeatureStore):
5
  """Represents gvsig store. It's used as Table/Layer objects store  
6
  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore)
3
__docformat__ = "restructuredtext en"
4

  
5
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore as JFeatureStore
6

  
7
class FeatureStore(JFeatureStore):
7 8
  """
8
  def __init__(self,store):
9
    WrapperToJava.__init__(self, store)
10
    #self.data = None
11
    self.fset = None
9
  Represents feature store.
10
  It's used as Table/Layer objects store
12 11
  
13
  def features(self, expresion = None, sortBy="", asc=True):
14
    """Returns layer features set (FeatureSet class), with all layer features, 
15
    or selected featured if there are (could be empty feature set) or None if
16
    gets an Exception.
17
    :param expresion: filter to apply to the feature set to select
18
        determinates features that match with expression
19
    :type expresion: string
20
    :param sortBy: name of attribute to sort
21
    :type sortby: string
22
    :param: asc: order
23
    :type asc: boolean
24
    :return: FeatureSet
12
  Extends the `java FeatureStore`_.
13
  
14
  .. _`java FeatureStore` : FIXME_URL
15
  """
16

  
17
  @staticmethod
18
  def getSchema(self):
19
    """
20
    Returns the schema of the store.
21
    Its configuration of attributes.
22
    """
23
    return self.getDefaultFeatureType()
24

  
25
  @staticmethod
26
  def features(self, expresion = None, sortby="", asc=True):
27
    """
28
    Returns layer features set, with all layer features, 
29
    or selected featured if there are (could be empty feature set).
30
    
31
    :parameters:
32
      expresion : string
33
        filter to apply to the feature set to select
34
      sortby : string
35
        coma separated names of attribute to sort
36
      asc : boolean
37
        True for order ascending, False for orden descending
38
    :return:
39
      The feature set request
40
    :returntype:
41
      FeatureSet
25 42
    """   
26
    if expresion == None and sortBy =="":
27
      self.fset = self.getFeatureSet()         
28
    else:
29
      try:
30
        application = ApplicationLocator.getManager()
31
        datamanager =  application.getDataManager()
32
        query = self.createFeatureQuery()
33
        if sortBy != "":
34
            order = FeatureQueryOrder()
35
            order.add(sortBy, asc)
36
            query.setOrder(order)
37
        if expresion != None:
38
            query.setFilter(datamanager.createExpresion(expresion))
39
        self.fset = self.getFeatureSet(query)
40
      except Exception, e:
41
        return None
43
    if expresion == None and sortby =="":
44
      return self.getFeatureSet()         
42 45
    
43
    return FeatureSet(self.fset)    
46
    try:
47
      application = ApplicationLocator.getManager()
48
      datamanager =  application.getDataManager()
49
      query = self.createFeatureQuery()
50
      if sortby != "":
51
          order = FeatureQueryOrder()
52
          order.add(sortby, asc)
53
          query.setOrder(order)
54
      if expresion != None:
55
          query.setFilter(datamanager.createExpresion(expresion))
56
      fset = self.getFeatureSet(query)
57
    except Exception, e:
58
      return None
59
    return fset
44 60

  
45
  def edit(self):
46
    """Set store in edition mode"""     
47
    if not self.isEditing():
48
        self().edit() 
49
     
50
  def append(self, *valuesList, **values):
61
  @staticmethod
62
  def __iter__(self):
63
    return self.getFeatureSet()
64
  
65
  @staticmethod
66
  def __len__(self):
67
    return self.getFeatureSet().getSize()
68
  
69
  @staticmethod
70
  def append(self, *args, **kwargs):
51 71
    """
52
    Creates a new feature from given values and insert it in the feature 
53
    set. If an error occurs raises RuntimeException.
54
    :param values: dictionary with name property value or list named params
55
    :type values: dict
72
    Append a new feature to the store.
73
    If the store is not in editing mode, it is set before to append the feature.
74
    
75
    If one args is provided, it soul be the feature to append.
76
    If pairs of name,value arguments are specified, a feature is build with its,
77
    and is appened to the store.
56 78
    """
57 79
    try:
58
      if len(valuesList) ==1:
59
        values.update(valuesList[0])
60
      
61 80
      if not self.isEditing():
62
        self.edit() 
81
        self.super_edit() 
82

  
83
      if len(args) ==1:
84
        values.insert(args[0])
85
        return
86
      
63 87
      f = self.createNewFeature()
64 88
      
65 89
      if f == None:
66 90
        raise RuntimeError("Failed to create a new Feature")
67
      for k,v in values.iteritems():
91
        
92
      for k,v in kwargs.iteritems():
68 93
        f.set(k,v)
69 94
        self.insert(f)
95
        
70 96
    except Throwable, ex:
71 97
      raise RuntimeException("Can't append values %s to layer %s (%s)" % (
72
        repr(values), 
98
        repr(kwargs), 
73 99
        self.getName(), 
74 100
        str(ex)
75 101
        )
76 102
      )
77 103

  
78
  def updateSchema(self, schema):
104
  @staticmethod
105
  def update(self, feature):
79 106
    """
80
    Updates store FeatureType. If an error occurs raises 
81
    RuntimeException.
82
    """
83
    try:
84
      self().update(schema._javaobj)
85
    except Throwable, ex:
86
      raise RuntimeException(repr(ex))
107
    Updates exist feature in the store or the schema of store.
87 108
    
88
  def update(self, feature):
109
    If the store is not in editing mode, it is set before to append the feature.
110

  
111
    If as parameter pass a Schema, update the schema of the store. If is a feature
112
    update this feature.
113
    
114
    :parameters:
115
      feature : Feature 
116
        feature to update
89 117
    """
90
    Updates exist feature in the layer featureSet
91
    :param editableFeature: editableFeature
92
    :type editableFeature: Java editableFeature
93
    """
94 118
    if not self.isEditing():
95
      self.edit() 
96
    
97
    if not isinstance(feature, EditableFeature):
98
      feature = feature._javaobj
99
    self.fset.update(feature)
119
        self.super_edit(self) 
120
    self.super_update(self,feature) 
100 121
  
101
  def getSchema(self):
102
    """Returns store data attributtes"""
103
    return Schema(self.getDefaultFeatureType())
104

  
122
  @staticmethod
123
  def edit(self):
124
    """
125
    Set store in edition mode.
126
    
127
    If the store is already in editing mode do thing.
128
    """     
129
    if not self.isEditing():
130
      self.super_edit()
131
     
132
  @staticmethod
105 133
  def commit(self):
106 134
    """
107
    Finish store edition saving changes. If an error occurs raises Throwable 
108
    Exception.
135
    Finish store edition saving changes. 
136
    If an error occurs abort transaction and raises Exception.
109 137
    """
110 138
    try:
111 139
      self.finishEditing()          
112 140
    except Throwable, ex:
113 141
      self.abort()
114
      raise Throwable("Can't finish layer edition, cancelling changes. %s" % repr(ex))
142
      raise RuntimeException("Can't finish layer edition, cancelling changes. %s" % repr(ex))
115 143
  
144
  @staticmethod
116 145
  def abort(self):
117
    """Finish store edition withoout saving changes and disposes itself"""
118
    self.cancelEditing() 
119
    self.dispose()
120

  
121
  def getSelection(self):
122
    """Returns store features selected set"""
123
    return FeatureSet(self().getSelection())
124

  
125
        
126
class FeatureSet(WrapperToJava):
127
  """Represents gvSIG FeatureSet 
128
  (org.gvsig.fmap.dal.feature.impl.featureset.DefaultFeatureSet)
129
  """
130
  def __init__(self,featureSet):
131
    WrapperToJava.__init__(self,featureSet)
146
    """
147
    Finish store edition withoout saving changes.
132 148
    
133
  def getCount(self):
134
    """Returns the number of elements in the featureSet"""
135
    return self.getSize()
136
  
137
  def update(self, feature):
149
    All changes are undoing.
138 150
    """
139
    Updates exist feature in the featureSet
140
    :param editableFeature: editableFeature
141
    :type editableFeature: Java editableFeature
151
    self.cancelEditing() 
152
 
153
  def __call__(self):
142 154
    """
143
    if not isinstance(feature, EditableFeature) and \
144
            not isinstance(feature, DefaultEditableFeature):
145
      feature = feature._javaobj
146
    self().update(feature)
147
  
148
  def __iter__(self):
149
    return  Iterator(self.fastIterator())
155
    Return the java object represented by this object.
150 156
    
151
class Selection(FeatureSet):
152
  """Manage selected features set from a store. Represents gvSIG 
153
  org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection.  
154
  """
155
  def __init__(self, featureSet):
156
    FeatureSet.__init__(self, featureSet)
157
    This method is for compatibility with scripting API of gvSIG 2.0
158
    
159
    :ReturnType:
160
      LayerVectorial
161
    :deprecated: 
162
      With gvSIG 2.1 the call this method isn't necesary
157 163
      
158
  def select(self, selection):
159
    """Inserts features in the features selection set"""
160
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
161
      self._javaobj.select(selection._javaobj)
162
    else:
163
      self._javaobj.select(selection)
164
    """
165
    return self    
164 166

  
165
  def deselect(self, selection):
166
    """Removes features in the features selection set"""
167
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
168
      self._javaobj.deselect(selection._javaobj)
169
    else:
170
      self._javaobj.deselect(selection)
171 167

  
172
  def isSelected(feature):
173
    """Returns True if given feature is selected"""
174
    if isinstance(feature, Feature):
175
      self._javaobj.isSelect(feature._javaobj)
176
    else:
177
      self._javaobj.isSelect(feature)
178
      
179
  def getCount(self):
180
    """Returns the number of elements in the selection"""
181
    return self.getSelectedCount()
182
    
183
class Feature(WrapperToJava):
184
  """Represents feature data It's a wrapper from gvSIG 
185
  org.gvsig.fmap.dal.feature.impl.DefaultFeature class
186
  """
187
  def __init__(self,feature):
188
    WrapperToJava.__init__(self,feature)
189
    self.featureNoEditable = None
168
#
169
# Save methods edit and update that are rewriten in python
170
#
171
JFeatureStore.super_edit = JFeatureStore.edit
172
JFeatureStore.super_update = JFeatureStore.update
173
#
174
# Inject new methods in the class JFeatureStore
175
#
176
JFeatureStore.getSchema = FeatureStore.getSchema
177
JFeatureStore.features = FeatureStore.features
178
JFeatureStore.append = FeatureStore.append
179
JFeatureStore.update = FeatureStore.update
180
JFeatureStore.edit = FeatureStore.edit
181
JFeatureStore.commit = FeatureStore.commit
182
JFeatureStore.abort = FeatureStore.abort
183
JFeatureStore.__call__ = FeatureStore.__call__
184
JFeatureStore.__iter__ = FeatureStore.__iter__
185
JFeatureStore.__len__ = FeatureStore.__len__
190 186

  
191
  def geometry(self):
192
    """Returns feature geometry"""
193
    return self.getDefaultGeometry()
194
   
195
  def getValues(self):
196
    """Returns dictionary with the pair name, value, feature attributes"""
197
    descriptor = self.getType()
198
    items = dict()
199
    for attr in descriptor.getAttributeDescriptors():
200
      name = attr.getName()
201
      value = self.get(attr.getName())
202
      items[name] = value
203
    return items 
204
  
205
  def edit(self):
206
    """Returns editable feature instance"""
207
    if not isinstance(self._javaobj, EditableFeature):
208
      self.featureNoEditable = self._javaobj
209
      self._javaobj = self._javaobj.getEditable()
210
  
211
  def __getitem__(self,key):
212
    return self.get(key)
213
  
214
  def __getattr__(self,name):
215
    #
216
    #FIX console error when try to introspect feature object
217
    if name in ('__methods__'):
218
        return dict()
219
    elif name in ('__members__'):
220
        return self.getValues().keys()
221
    elif name == '__dict__':
222
        return self.getValues()      
223
        
224
    try:
225
      v = getattr(self._javaobj, name, None)
226
      if v == None:
227
        v = self().get(name)        
228
      return v
229
    except Throwable, ex:
230
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
231 187

  
232
class Schema(WrapperToJava):
233
  """Stores data properties definition. Represents gvSIG FeatureType
234
  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureType)
235
  """
236 188

  
237
  def __init__(self, featureType):
238
    WrapperToJava.__init__(self,featureType)
239
    self.featureTypeNoEditable = None
240
  
241
  def append(self, name, type, size=None, default=None, precision=4):
242
    """Adds new property to feature properties definition. If error occurs 
243
    raises RuntimeError.    
244
    :param name: Feature property name
245
    :type name: String
246
    :param type: Feature property type
247
    :type name: String
248
    :param size: Feature property size
249
    :type size: int
250
    :param default: Feature property default value
251
    :return: new atribute
252
    """
253
    if not isinstance(self._javaobj, EditableFeatureType):
254
        self.modify()
255
    
256
    if isinstance(type, str):
257
      try:
258
        application = ApplicationLocator.getManager()
259
        datamanager =  application.getDataManager()
260
        dataTypes = application.getDataTypesManager()
261
        type = dataTypes.getType(type) #dataType constant value from string
262
      except:
263
        raise RuntimeError(
264
            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
265
                type, 
266
                name, 
267
                type, 
268
                size, 
269
                default
270
            )
271
        )
272
    if isinstance(type, int):
273
      try:
274
        type = dataTypes.get(type)
275
      except:
276
        raise RuntimeError(
277
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
278
                type, 
279
                name, 
280
                type, 
281
                size, 
282
                default
283
            )
284
        )
285
      
286
    attribute = self.add(name, type.getType())
287
 
288
    if size != None: 
289
      attribute.setSize(size)
290
    
291
    if default != None:
292
      attribute.setDefaultValue(default)
293
      
294
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
295
      attribute.setPrecision(precision)
296
    
297
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
298
      self.setDefaultGeometryAttributeName(name)
299
    
300
    return attribute
301

  
302
  def __getitem__(self, name):
303
    return self.getAttributeDescriptor(name)
304

  
305
  def get(self, name, default=None):
306
    """Returns a feature attribute descriptor that contains information about 
307
    one feature attribute, such as its name, data type or precision. 
308
    :param name: Attribute name
309
    :type name: string
310
    :param default: Value to return if no attribute name found. 
311
    :return: AttributeDescriptor
312
    """
313
    x = self.getAttributeDescriptor(name)
314
    if x == None:
315
      return default
316
    return x
317
  
318
  def getAttrNames(self):
319
    """Returns a list with attributes names"""
320
    if not self.getAttributeDescriptors():
321
      return None
322
        
323
    return [attr.getName() for attr in self.getAttributeDescriptors()]
324
    
325
    
326
  def getCopy(self):
327
    """Returns a itself clone"""
328
    return Schema(self().getCopy())
329
  
330
  def modify(self):
331
    """Sets edit mode"""
332
    if not isinstance(self._javaobj, EditableFeatureType):
333
      self.featureTypeNoEditable = self._javaobj
334
      self._javaobj = self._javaobj.getEditable()
335

  

Also available in: Unified diff