Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / test / java / org / gvsig / tools / dynobject / impl / DefaultDynClassTest.java @ 629

History | View | Annotate | Download (14.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2008 {DiSiD Technologies}  {{Task}}
26
 */
27
package org.gvsig.tools.dynobject.impl;
28

    
29
import java.util.ArrayList;
30
import java.util.Arrays;
31
import java.util.List;
32

    
33
import org.easymock.MockControl;
34

    
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dataTypes.DataTypes;
37
import org.gvsig.tools.dynobject.DynClass;
38
import org.gvsig.tools.dynobject.DynField;
39
import org.gvsig.tools.dynobject.DynObject;
40
import org.gvsig.tools.dynobject.DynObjectManager;
41
import org.gvsig.tools.dynobject.DynObjectValueItem;
42
import org.gvsig.tools.dynobject.DynStruct;
43
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
44

    
45
/**
46
 * Unit tests for the class {@link DefaultDynClass}.
47
 * 
48
 * @author <a href="mailto:cordin@disid.com">C?sar Ordi?ana</a>
49
 */
50
public class DefaultDynClassTest extends AbstractLibraryAutoInitTestCase {
51

    
52
        private MockControl managerControl;
53
        private DynObjectManager manager;
54
        private DefaultDynClass dynClass;
55

    
56
        protected void doSetUp() throws Exception {
57
                managerControl = MockControl.createNiceControl(DynObjectManager.class);
58
                manager = (DynObjectManager) managerControl.getMock();
59
                dynClass = new DefaultDynClass(manager, new DefaultDynClassName(
60
                                "dynclass"), "description");
61
        }
62

    
63
        /**
64
         * Test method for
65
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#newInstance()}.
66
         */
67
        // public void testNewInstance() {
68
        // TODO: solve
69
        // MockControl dynObjControl = MockControl
70
        // .createNiceControl(DynObject.class);
71
        // DynObject dynObj = (DynObject) dynObjControl.getMock();
72
        // dynObjControl.expectAndReturn(dynObj.getDynClass(), dynClass);
73
        // dynObjControl.replay();
74
        //
75
        // managerControl.expectAndReturn(manager.createDynObject(dynClass),
76
        // dynObj);
77
        // managerControl.replay();
78
        //
79
        // DynObject newDynObj = dynClass.newInstance();
80
        // assertTrue(dynClass.isInstance(newDynObj));
81
        // }
82

    
83
        /**
84
         * Test method for
85
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(org.gvsig.tools.dynobject.DynClass)}
86
         * .
87
         */
88
        public void testExtendDynClass() {
89
                final String parent = "parent";
90

    
91
                DefaultDynClassName name = new DefaultDynClassName(parent);
92

    
93
                DefaultDynClass parentDynClass = new DefaultDynClass(manager, name,
94
                                "parent description");
95

    
96
                managerControl.expectAndReturn(manager.has(parent), true);
97
                managerControl.expectAndReturn(manager.get(parent), parentDynClass);
98
                managerControl.replay();
99

    
100
                dynClass.extend(parentDynClass);
101

    
102
                DynClass[] parents = dynClass.getSuperDynClasses();
103
                assertEquals(parentDynClass, parents[0]);
104
        }
105

    
106
        /**
107
         * Test method for
108
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(java.lang.String)}
109
         * .
110
         */
111
        public void testExtendString() {
112
                final String parent = "parent";
113

    
114
                DefaultDynClassName name = new DefaultDynClassName(parent);
115

    
116
                DefaultDynClass parentDynClass = new DefaultDynClass(manager, name,
117
                                "parent description");
118

    
119
                managerControl.expectAndReturn(manager.has(parent), true);
120
                managerControl.expectAndReturn(manager.get(parent), parentDynClass);
121
                managerControl.replay();
122

    
123
                dynClass.extend(parent);
124

    
125
                DynClass[] parents = dynClass.getSuperDynClasses();
126
                assertEquals(parentDynClass, parents[0]);
127
        }
128

    
129
        /**
130
         * Test method for
131
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDynField(java.lang.String)}
132
         * ,
133
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#addDynField(java.lang.String)}
134
         * ,
135
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#removeDynField(java.lang.String)}
136
         * ,
137
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDeclaredDynFields()}
138
         * .
139
         */
140
        public void testDynFields() {
141
                final String field1 = "field1";
142
                final String field2 = "field2";
143

    
144
                DynField dynField1 = dynClass.addDynField(field1);
145
                assertEquals(dynField1, dynClass.getDynField(field1));
146

    
147
                DynField dynField2 = dynClass.addDynField(field2);
148
                assertEquals(dynField2, dynClass.getDynField(field2));
149

    
150
                DynField[] fields = dynClass.getDeclaredDynFields();
151
                assertEquals(2, fields.length);
152

    
153
                dynClass.removeDynField(field1);
154
                assertNull(dynClass.getDynField(field1));
155
        }
156

    
157
        /**
158
         * Test method for
159
         * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#equals(Object)}.
160
         */
161
        public void testEquals() {
162
                DefaultDynClass dynClass2 = new DefaultDynClass(manager,
163
                                new DefaultDynClassName("dynclass2"), "description2");
164
                DefaultDynClass dynClassB = new DefaultDynClass(manager,
165
                                new DefaultDynClassName("dynclass"), "description");
166

    
167
                assertTrue(dynClass.equals(dynClassB));
168
                assertFalse(dynClass.equals(dynClass2));
169
                assertFalse(dynClass.equals(null));
170
        }
171

    
172
        /**
173
         * Validation test: DynObjects as dynfields within a dynObject.
174
         * 
175
         * Metadata A will have metadata B as porperty. for each dynField, a
176
         * validate function will be triggered with the current
177
         * 
178
         * @throws Exception
179
         * 
180
         */
181
        public void testValidate() throws Exception {
182

    
183
                /**
184
                 * Creating and registering both dynClasses
185
                 */
186
                DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
187

    
188
                DynClass dynClassA = new DefaultDynClass(manager,
189
                                new DefaultDynClassName("metadata", "DynclassA"),
190
                                "descriptionA");
191
                dynManager.add(dynClassA);
192

    
193
                DynClass dynClassB = new DefaultDynClass(manager,
194
                                new DefaultDynClassName("metadata", "DynclassB"),
195
                                "descriptionB");
196
                dynManager.add(dynClassB);
197

    
198
                /**
199
                 * Filling dynClass B with "Name" and "Street"
200
                 */
201
                dynClassB.addDynFieldString("name");
202
                dynClassB.addDynFieldString("street");
203

    
204
                /**
205
                 * Filling dynClass A with "Name" and the dynClass B named "dynObjB"
206
                 */
207
                dynClassA.addDynFieldString("name");
208
                dynClassA.addDynField("dynObjB").setType(DataTypes.DYNOBJECT)
209
                                .setSubtype(dynClassB.getFullName());
210

    
211
                /**
212
                 * Creating dynObjects for current dynClasses and applying dynObject B
213
                 * as a property of A
214
                 */
215
                DynObject dynObjA = new DefaultDynObject(dynClassA);
216
                DynObject dynObjB = new DefaultDynObject(dynClassB);
217

    
218
                // TODO: Note that even specified a subType, if we set a different
219
                // dynObject, it will not check if the subType is correct.
220
                dynObjA.setDynValue("dynObjB", dynObjB);
221

    
222
                /**
223
                 * Once the structure has been created, we will validate each field of
224
                 * dynObject A, which also contains B as a property.
225
                 */
226
                DynField[] fields = dynObjA.getDynClass().getDynFields();
227
                DynField field;
228
                Object value;
229
                for (int i = 0; i < fields.length; ++i) {
230
                        field = fields[i];
231
                        value = dynObjA.getDynValue(field.getName());
232

    
233
                        // Checking that it actually contains the DynObject B as a
234
                        // property
235
                        if (field.getType() == DataTypes.DYNOBJECT) {
236
                                assertTrue(dynClassB.equals(((DynObject) value).getDynClass()));
237
                        }
238

    
239
                        // Performing validation
240
                        field.validate(value);
241
                }
242
        }
243

    
244
        /**
245
         * 
246
         * Duplicate test: checking if, given two dynClasses A and B, dynFields from
247
         * class A can be duplicated into dynClass B by using setters in B with the
248
         * returned values of getters of A as input.
249
         * 
250
         */
251
        public void testSetters() {
252
                /**
253
                 * Creating and registering both dynClasses
254
                 */
255
                DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
256

    
257
                DynClass dynClassA = new DefaultDynClass(manager,
258
                                new DefaultDynClassName("metadata", "DynclassA"),
259
                                "descriptionA");
260

    
261
                DynClass dynClassB = new DefaultDynClass(manager,
262
                                new DefaultDynClassName("metadata", "DynclassB"),
263
                                "descriptionB");
264

    
265
                /**
266
                 * Filling dynClass B with "Name" and "Street"
267
                 */
268
                dynClassB.addDynFieldString("name");
269
                dynClassB.addDynFieldString("street");
270

    
271
                fillInitialDynfields(dynClassA, dynClassB.getFullName());
272

    
273
                // /**
274
                // * Creating dynObjects for current dynClasses and applying dynObject B
275
                // * as a property of A
276
                // */
277
                // DynObject dynObjA = new DefaultDynObject(dynClassA);
278
                // DynObject dynObjB = new DefaultDynObject(dynClassB);
279

    
280
                copyDefinitions(dynClassA, dynClassB);
281

    
282
                checkValues(dynClassA, dynClassB);
283
        }
284

    
285
        private List createList(Object[] values) {
286
                DynObjectValueItem[] valueItems = new DynObjectValueItem[values.length];
287
                for (int i = 0; i < values.length; i++) {
288
                        valueItems[i] = new DynObjectValueItem(values[i]);
289
                }
290
                return Arrays.asList(valueItems);
291
        }
292

    
293
        /**
294
         * Filling dynClass A with different parameters that will be duplicated into
295
         * dynClass B afterwards.
296
         */
297
        private void fillInitialDynfields(DynClass definition,
298
                        String dynClassBFullName) {
299

    
300
                List items = new ArrayList();
301

    
302
                definition.addDynFieldString("name");
303
                definition.addDynField("dynObjB").setType(DataTypes.DYNOBJECT)
304
                                .setSubtype(dynClassBFullName);
305

    
306
                definition.addDynFieldString("id").setReadOnly(true); // optional
307

    
308
                definition.addDynFieldString("language").setMandatory(true);
309

    
310
                definition.addDynFieldString("charachterset").setMandatory(true)
311
                                .setAvailableValues(createList(new String[] { "a", "b", "c" }));
312

    
313
                definition
314
                                .addDynFieldList("hierarchyLevels")
315
                                .setElementsType(DataTypes.STRING)
316
                                .setMandatory(true)
317
                                .getElementsType()
318
                                .setAvailableValues(
319
                                                createList(new String[] { "hier1", "hier2", "hier3" }));
320

    
321
                definition.addDynFieldDate("date").setMandatory(true);
322

    
323
                definition.addDynFieldList("keywords")
324
                                .setElementsType(DataTypes.STRING);
325

    
326
                definition.addDynFieldList("dynObjects")
327
                                .setElementsType(DataTypes.DYNOBJECT).setMandatory(true)
328
                                .setSubtype(dynClassBFullName).getElementsType()
329
                                .setSubtype(dynClassBFullName);
330

    
331
        }
332

    
333
        private void copyDefinitions(DynClass dynClassA, DynClass dynClassB) {
334
                DynField field;
335
                DynField fields[] = dynClassA.getDynFields();
336
                for (int i = 0; i < fields.length; i++) {
337
                        field = fields[i];
338
                        ;
339
                        if (dynClassB.getDynField(field.getName()) == null) {
340
                                addDynField(dynClassB, field);
341
                        }
342
                }
343

    
344
                // dynFields must have the same number of items or more if some items
345
                // have been previously defined.
346
                assertTrue(dynClassB.getDynFields().length >= fields.length);
347
        }
348

    
349
        private void copyValues(DynObject oldDefinition, DynObject newDefinition) {
350
                Object value;
351
                DynField field;
352
                DynField fields[] = oldDefinition.getDynClass().getDynFields();
353
                for (int i = 0; i < fields.length; i++) {
354
                        field = fields[i];
355
                        value = oldDefinition.getDynValue(field.getName());
356
                        if (newDefinition.getDynClass().getDynField(field.getName()) == null) {
357
                                addDynField(newDefinition.getDynClass(), field);
358
                        }
359
                        if (value == null) {
360
                                continue;
361
                        }
362
                        if (value instanceof DynObject) {
363
                                DynObject parent = (DynObject) value;
364
                                DynStruct parentDefinition = parent.getDynClass();
365
                                DynClass childDefinition = manager.get(
366
                                                parentDefinition.getName(),
367
                                                parentDefinition.getNamespace());
368
                                DynObject child = manager.createDynObject(childDefinition);
369

    
370
                                copyValues(child, parent);
371
                                newDefinition.setDynValue(field.getName(), child);
372

    
373
                        } else {
374
                                newDefinition.setDynValue(field.getName(), value);
375
                        }
376
                }
377
        }
378

    
379
        private void addDynField(DynStruct definition, DynField field) {
380
                DynField dynField = definition.addDynField(field.getName())
381
                                .setType(field.getType()).setSubtype(field.getSubtype())
382
                                .setAvailableValues(field.getAvailableValues())
383
                                .setClassOfItems(field.getClassOfItems())
384
                                .setClassOfValue(field.getClassOfValue())
385
                                .setDefaultFieldValue(field.getDefaultValue())
386
                                .setDescription(field.getDescription())
387
                                .setGroup(field.getGroup()).setHidden(field.isHidden())
388
                                .setMandatory(field.isMandatory())
389
                                .setMaxValue(field.getMaxValue())
390
                                .setMinValue(field.getMinValue()).setOrder(field.getOder())
391
                                .setPersistent(field.isPersistent())
392
                                .setReadOnly(field.isReadOnly());
393

    
394
                copyElementsType(dynField, field.getElementsType());
395
        }
396

    
397
        private void copyElementsType(DynField dynField, DynField elementsType) {
398
                if (elementsType == null) {
399
                        return;
400
                }
401

    
402
                dynField.setElementsType(elementsType.getType());
403
                dynField.getElementsType().setSubtype(elementsType.getSubtype())
404
                                .setAvailableValues(elementsType.getAvailableValues())
405
                                .setClassOfItems(elementsType.getClassOfItems())
406
                                .setClassOfValue(elementsType.getClassOfValue())
407
                                .setDefaultFieldValue(elementsType.getDefaultValue())
408
                                .setDescription(elementsType.getDescription())
409
                                .setGroup(elementsType.getGroup())
410
                                .setHidden(elementsType.isHidden())
411
                                .setMandatory(elementsType.isMandatory())
412
                                .setMaxValue(elementsType.getMaxValue())
413
                                .setMinValue(elementsType.getMinValue())
414
                                .setOrder(elementsType.getOder())
415
                                .setPersistent(elementsType.isPersistent())
416
                                .setReadOnly(elementsType.isReadOnly());
417
        }
418

    
419
        private void checkValues(DynClass dynObjA, DynClass dynObjB) {
420
                DynField[] dynFieldsA = dynObjA.getDynFields();
421
                DynField[] dynFieldsB = dynObjB.getDynFields();
422

    
423
                DynField field;
424
                boolean done = false;
425
                for (int i = 0; i < dynFieldsA.length; ++i) {
426
                        field = dynFieldsA[i];
427
                        for (int j = 0; j < dynFieldsB.length; ++j) {
428
                                if (dynFieldsB[j].getName().equals(field.getName())) {
429
                                        checkDynField(field, dynFieldsB[j]);
430
                                        done = true;
431
                                }
432
                        }
433
                        // dynField must be defined in both lists.
434
                        assertTrue(done);
435

    
436
                }
437
        }
438

    
439
        private void checkDynField(DynField fieldA, DynField fieldB) {
440

    
441
                assertEquals(fieldA.getName(), fieldA.getName());
442
                assertEquals(fieldA.getType(), fieldB.getType());
443
                assertEquals(fieldA.getSubtype(), fieldB.getSubtype());
444
                assertEquals(fieldA.getAvailableValues(), fieldB.getAvailableValues());
445
                assertEquals(fieldA.getClassOfItems(), fieldB.getClassOfItems());
446
                assertEquals(fieldA.getClassOfValue(), fieldB.getClassOfValue());
447
                assertEquals(fieldA.getDefaultValue(), fieldB.getDefaultValue());
448
                assertEquals(fieldA.getDescription(), fieldB.getDescription());
449
                assertEquals(fieldA.getGroup(), fieldB.getGroup());
450
                assertEquals(fieldA.isHidden(), fieldB.isHidden());
451
                assertEquals(fieldA.isMandatory(), fieldB.isMandatory());
452
                assertEquals(fieldA.getMaxValue(), fieldB.getMaxValue());
453
                assertEquals(fieldA.getMinValue(), fieldB.getMinValue());
454
                assertEquals(fieldA.getOder(), fieldB.getOder());
455
                assertEquals(fieldA.isPersistent(), fieldB.isPersistent());
456
                assertEquals(fieldA.isReadOnly(), fieldB.isReadOnly());
457

    
458
        }
459

    
460
}