Revision 1118

View differences:

org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/test/java/org/gvsig/tools/dynobject/impl/DefaultDynFieldTest.java
50 50
package org.gvsig.tools.dynobject.impl;
51 51

  
52 52
import junit.framework.TestCase;
53
import org.gvsig.tools.dataTypes.DataTypes;
53 54

  
54 55
/**
55 56
 * Unit tests for the class {@link DefaultDynField}.
......
63 64
    }
64 65
    
65 66
    public void testEquals() {
66
        DefaultDynField field1 = new DefaultDynField("field1");
67
        DefaultDynField field2 = new DefaultDynField("field2");
68
        DefaultDynField field1b = new DefaultDynField("field1");
67
        DefaultDynField field1 = new DefaultDynField("field1", DataTypes.STRING);
68
        DefaultDynField field2 = new DefaultDynField("field2", DataTypes.STRING);
69
        DefaultDynField field1b = new DefaultDynField("field1", DataTypes.STRING);
69 70

  
70 71
        assertTrue(field1.equals(field1b));
71 72
        assertFalse(field1.equals(field2));
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/DynField_v2.java
10 10
 *
11 11
 * This program is distributed in the hope that it will be useful,
12 12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 14
 * GNU General Public License for more details.
15 15
 *
16 16
 * You should have received a copy of the GNU General Public License
17 17
 * along with this program; if not, write to the Free Software
18 18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
19
 * MA 02110-1301, USA.
20 20
 *
21 21
 * For any additional information, do not hesitate to contact us
22 22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23 23
 */
24

  
25 24
package org.gvsig.tools.dynobject;
26 25

  
26
public interface DynField_v2 extends DynField_LabelAttribute {
27 27

  
28
    public DynField setClassOfValue(DynStruct dynStrct);
28 29

  
29
public interface DynField_v2 extends DynField_LabelAttribute{
30
    public DynField setClassOfValue(String theClassNameOfValue);
30 31

  
31
    public DynStruct getStructWhenTypeIsDynObject();
32
    
33
    public DynField setStructWhenTypeIsDynObject(DynStruct dynStruct) ;
34
	
32
    public String getClassNameOfValue();
33

  
34
    public DynStruct getDynClassOfValue();
35

  
36
    public DynField setTypeOfItems(int type);
37

  
38
    public int getTypeOfItems();
39

  
40
    public DynField setClassOfItems(DynStruct dynStrct);
41

  
42
    public DynField setClassOfItems(Class theClass);
43

  
44
    public DynField setClassOfItems(String theClassNameOfValue);
45

  
46
    public String getClassNameOfItems();
47

  
48
    public DynStruct getDynClassOfItems();
49

  
50
    public Class getClassOfItems();
51

  
35 52
    public Tags getTags();
36
    
53

  
37 54
    public DynField setRelationType(int relationType);
38
    
55

  
39 56
    public int getRelationType();
40 57
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/DynStruct_v2.java
32 32
    
33 33
    public void setLabel(String label);
34 34
    
35
    public DynField addDynField(String name, int type);
36
    
35 37
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/exception/DynFieldValidateException.java
42 42
		super(messagefmt, key, code);
43 43
	}
44 44

  
45
        protected DynFieldValidateException(String messagefmt, Throwable cause, String key, long code) {
46
		super(messagefmt, cause, key, code);
47
	}
48

  
45 49
	public DynFieldValidateException(Object value, DynField field,
46 50
			Throwable cause) {
47 51
		super(MESSAGE_FORMAT, MESSAGE_KEY, serialVersionUID);
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/exception/DynMethodException.java
34 34
	 */
35 35
	private static final long serialVersionUID = -7079190638140530989L;
36 36

  
37
	protected DynMethodException(String messagefmt, String key,	long code) {
37
	protected DynMethodException(String messagefmt, String key, long code) {
38 38
		super(messagefmt, key, code);
39 39
	}
40 40

  
41
        protected DynMethodException(String messagefmt, Throwable cause, String key, long code) {
42
		super(messagefmt, cause, key, code);
43
	}
44

  
41 45
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/impl/DynClassImportHelper.java
10 10
 *
11 11
 * This program is distributed in the hope that it will be useful,
12 12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 14
 * GNU General Public License for more details.
15 15
 *
16 16
 * You should have received a copy of the GNU General Public License
17 17
 * along with this program; if not, write to the Free Software
18 18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
19
 * MA 02110-1301, USA.
20 20
 *
21 21
 * For any additional information, do not hesitate to contact us
22 22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
......
28 28
import java.util.ArrayList;
29 29
import java.util.HashMap;
30 30
import java.util.Iterator;
31
import java.util.LinkedHashMap;
31 32
import java.util.List;
32 33
import java.util.Map;
33 34

  
......
52 53

  
53 54
public class DynClassImportHelper {
54 55

  
55
	private static final Logger LOG = LoggerFactory
56
			.getLogger(DynClassImportHelper.class);
56
    private static final Logger LOG = LoggerFactory
57
            .getLogger(DynClassImportHelper.class);
57 58

  
58
	private static final String VERSION_VALUE = "1.0.0";
59
    private static final String VERSION_VALUE = "1.0.0";
59 60

  
60
	private static final String DEFINITIONS_TAG = "definitions";
61
	private static final String VERSION_TAG = "version";
62
	private static final String CLASSES_TAG = "classes";
61
    private static final String DEFINITIONS_TAG = "definitions";
62
    private static final String VERSION_TAG = "version";
63
    private static final String CLASSES_TAG = "classes";
63 64

  
64
	private static final String CLASS_TAG = "class";
65
	private static final String CLASS_NAME_TAG = "name";
66
	private static final String CLASS_NAMESPACE_TAG = "namespace";
67
	private static final String CLASS_DESCRIPTION_TAG = "description";
68
	private static final String CLASS_SUPERCLASSNAMES_TAG = "superClassNames";
69
	private static final String CLASS_SUPERCLASSNAME_TAG = "superClassName";
70
	private static final String CLASS_EXTENDS_TAG = "extends";
71
	private static final String CLASS_EXTENDS_CLASS_TAG = "class";
72
	private static final String CLASS_FIELDS_TAG = "fields";
65
    private static final String CLASS_TAG = "class";
66
    private static final String CLASS_NAME_TAG = "name";
67
    private static final String CLASS_NAMESPACE_TAG = "namespace";
68
    private static final String CLASS_DESCRIPTION_TAG = "description";
69
    private static final String CLASS_SUPERCLASSNAMES_TAG = "superClassNames";
70
    private static final String CLASS_SUPERCLASSNAME_TAG = "superClassName";
71
    private static final String CLASS_EXTENDS_TAG = "extends";
72
    private static final String CLASS_EXTENDS_CLASS_TAG = "class";
73
    private static final String CLASS_FIELDS_TAG = "fields";
73 74

  
74
	private static final String FIELD_TAG = "field";
75
	private static final String FIELD_NAME_TAG = "name";
76
	private static final String FIELD_DESCRIPTION_TAG = "description";
77
	private static final String FIELD_SUBTYPE_TAG = "subtype";
78
	private static final String FIELD_TYPE_TAG = "type";
79
	private static final String FIELD_ISMANDATORY_TAG = "mandatory";
80
	private static final String FIELD_ISPERSISTENT_TAG = "persistent";
81
	private static final String FIELD_MINVALUE_TAG = "minValue";
82
	private static final String FIELD_MAXVALUE_TAG = "maxValue";
83
	private static final String FIELD_CLASSOFVALUE_TAG = "classOfValue";
84
	private static final String FIELD_CLASSOFITEMS_TAG = "classOfItems";
85
	private static final String FIELD_ELEMENTTYPE_TAG = "elementType";
86
	private static final String FIELD_STRUCTUSEDWHENISDYNOBJECT_TAG = "StructWhenTypeIsDynObject";
87
	private static final String FIELD_DEFAULTVALUE_TAG = "defaultValue";
88
	// private static final String FIELD_TYPEOFAVALILABLEVALUES_TAG =
89
	// "typeOfAvailableValues";
90
	private static final String FIELD_AVALILABLEVALUES_TAG = "availableValues";
91
	private static final String FIELD_GROUP_TAG = "group";
92
	private static final String FIELD_ORDER_TAG = "order";
93
	private static final String FIELD_HIDDEN_TAG = "hidden";
94
	private static final String FIELD_LABEL_TAG = "label";
95
	private static final String FIELD_TAGS_TAG = "tags";
96
	private static final String VALUEITEM_TAGNAME_TAG = "name";
97
	
98
	private static final String VALUEITEM_TAG = "valueItem";
99
	private static final String VALUEITEM_LABEL_TAG = "label";
100
	private static final String VALUEITEM_VALUE_TAG = "value";
75
    private static final String FIELD_TAG = "field";
76
    private static final String FIELD_NAME_TAG = "name";
77
    private static final String FIELD_DESCRIPTION_TAG = "description";
78
    private static final String FIELD_SUBTYPE_TAG = "subtype";
79
    private static final String FIELD_TYPE_TAG = "type";
80
    private static final String FIELD_ISMANDATORY_TAG = "mandatory";
81
    private static final String FIELD_ISPERSISTENT_TAG = "persistent";
82
    private static final String FIELD_MINVALUE_TAG = "minValue";
83
    private static final String FIELD_MAXVALUE_TAG = "maxValue";
101 84

  
102
	private DynObjectManager manager = ToolsLocator.getDynObjectManager();
85
    private static final String FIELD_CLASSOFVALUE_TAG = "classOfValue";
86
    private static final String FIELD_CLASSOFITEMS_TAG = "classOfItems";
87
    private static final String FIELD_TYPEOFITEMS_TAG = "typeOfItems";
103 88

  
104
	private Map dynClasses = null;
105
	
106
	private String getNullWhenEmptyString(String value) {
107
		if (value != null) {
108
			if (value.trim().length() == 0) {
109
				return null;
110
			}
111
		}
112
		return value;
89
    private static final String FIELD_DEFAULTVALUE_TAG = "defaultValue";
90
    private static final String FIELD_AVALILABLEVALUES_TAG = "availableValues";
91
    private static final String FIELD_GROUP_TAG = "group";
92
    private static final String FIELD_ORDER_TAG = "order";
93
    private static final String FIELD_HIDDEN_TAG = "hidden";
94
    private static final String FIELD_LABEL_TAG = "label";
95
    private static final String FIELD_TAGS_TAG = "tags";
96
    private static final String VALUEITEM_TAGNAME_TAG = "name";
113 97

  
114
	}
98
    private static final String VALUEITEM_TAG = "valueItem";
99
    private static final String VALUEITEM_LABEL_TAG = "label";
100
    private static final String VALUEITEM_VALUE_TAG = "value";
115 101

  
116
	private String nextText(XmlPullParser parser)
117
			throws XmlPullParserException, IOException {
118
		return getNullWhenEmptyString(parser.nextText());
119
	}
102
    private DynObjectManager manager = ToolsLocator.getDynObjectManager();
120 103

  
121
	private String getAttributeValue(XmlPullParser parser, int i)
122
			throws XmlPullParserException, IOException {
123
		return getNullWhenEmptyString(parser.getAttributeValue(i));
124
	}
104
    private Map dynClasses = null;
125 105

  
126
	public Map importDefinitions(InputStream resource, ClassLoader loader,
127
			String defaultNamespace) throws XmlPullParserException, IOException {
106
    private String getNullWhenEmptyString(String value) {
107
        if ( value != null ) {
108
            if ( value.trim().length() == 0 ) {
109
                return null;
110
            }
111
        }
112
        return value;
128 113

  
129
		XmlPullParserFactory factory = XmlPullParserFactory.newInstance(
130
				ToolsLocator.getInstance().getXmlPullParserFactoryClassNames(),
131
				null);
114
    }
132 115

  
133
		XmlPullParser parser = factory.newPullParser();
116
    private String nextText(XmlPullParser parser)
117
            throws XmlPullParserException, IOException {
118
        return getNullWhenEmptyString(parser.nextText());
119
    }
134 120

  
135
		parser.setInput(resource, null);
121
    private String getAttributeValue(XmlPullParser parser, int i)
122
            throws XmlPullParserException, IOException {
123
        return getNullWhenEmptyString(parser.getAttributeValue(i));
124
    }
136 125

  
137
		return importDefinitions(parser, loader, defaultNamespace);
138
	}
126
    public Map importDefinitions(InputStream resource, ClassLoader loader,
127
            String defaultNamespace) throws XmlPullParserException, IOException {
139 128

  
140
	private class Definitions extends HashMap implements Map {
129
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance(
130
                ToolsLocator.getInstance().getXmlPullParserFactoryClassNames(),
131
                null);
141 132

  
142
		/**
143
		 * 
144
		 */
145
		private static final long serialVersionUID = -3322643637478345069L;
133
        XmlPullParser parser = factory.newPullParser();
146 134

  
147
		public Object put(Object key, Object value) {
148
			return super.put(((String) key).toLowerCase(), value);
149
		}
135
        parser.setInput(resource, null);
150 136

  
151
		public Object get(Object theName) {
152
			DynClass definition;
153
			definition = (DynClass) super.get(((String) theName).toLowerCase());
154
			if (definition != null) {
155
				return definition;
156
			}
157
			// No ha encontrado la clase pedida, podria ser que el namespace
158
			// no coincida, vamos a buscarla ignorando el namespace en caso
159
			// de que este no se haya indicado.
160
			DynClassName name = manager.createDynClassName((String) theName);
161
			if (name.getNamespace() == null) {
162
				// No han especificado namespace, asi que busco la primera
163
				// que tenga como nombre el indicado independientemente del
164
				// namespace que tenga.
165
				Iterator it = this.values().iterator();
166
				while (it.hasNext()) {
167
					definition = (DynClass) it.next();
168
					if (definition.getName().equalsIgnoreCase(name.getName())) {
169
						return definition;
170
					}
171
				}
172
			} else {
173
				// Han especificaso un namespace, asi que voy a buscar una que
174
				// no tenga namespace y su nombre concuerde.
175
				Iterator it = this.values().iterator();
176
				while (it.hasNext()) {
177
					definition = (DynClass) it.next();
178
					if (definition.getNamespace() == null
179
							&& definition.getName().equalsIgnoreCase(
180
									name.getName())) {
181
						return definition;
182
					}
183
				}
184
			}
185
			return null;
186
		}
137
        return importDefinitions(parser, loader, defaultNamespace);
138
    }
187 139

  
188
		public boolean containsKey(Object key) {
189
			String lowerKey = ((String) key).toLowerCase();
190
			if (super.containsKey(lowerKey)) {
191
				return true;
192
			}
193
			Object value = this.get(lowerKey);
194
			return value != null;
195
		}
196
	}
140
    private class Definitions extends HashMap implements Map {
197 141

  
198
	public Map importDefinitions(XmlPullParser parser, ClassLoader loader,
199
			String defaultNamespace) throws XmlPullParserException, IOException {
200
		dynClasses = new Definitions();
201
		String version = null;
142
        /**
143
         *
144
         */
145
        private static final long serialVersionUID = -3322643637478345069L;
202 146

  
203
		if (loader == null) {
204
			loader = this.getClass().getClassLoader();
205
		}
206
		parser.nextTag();
207
		parser.require(XmlPullParser.START_TAG, null, DEFINITIONS_TAG);
208
		for (int i = 0; i < parser.getAttributeCount(); i++) {
209
			String name = parser.getAttributeName(i);
210
			if (name.equalsIgnoreCase(VERSION_TAG)) {
211
				version = this.getAttributeValue(parser, i);
212
			} else {
213
				throw new WrongVersionException(parser);
214
			}
215
		}
216
		parser.nextTag();
217
		if (parser.getName().equalsIgnoreCase(VERSION_TAG)) {
218
			parser.require(XmlPullParser.START_TAG, null, VERSION_TAG);
219
			version = parser.nextText();
220
			if (!version.trim().equals(VERSION_VALUE)) {
221
				throw new UnsupportedClassVersionError();
222
			}
223
			parser.require(XmlPullParser.END_TAG, "", VERSION_TAG);
224
			parser.nextTag();
225
		}
147
        public Object put(Object key, Object value) {
148
            return super.put(((String) key).toLowerCase(), value);
149
        }
226 150

  
227
		parser.require(XmlPullParser.START_TAG, "", CLASSES_TAG);
228
		parser.nextTag();
229
		while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
230
				.getName().equals(CLASSES_TAG))) {
231
			checkEndDocument(parser);
232
			DynClass dynClass = importDynClass(parser, loader,
233
					defaultNamespace, dynClasses);
234
			try {
235
				((DefaultDynClass) dynClass).check();
236
			} catch (ListBaseException e) {
237
				throw new DynObjectRuntimeException(e);
238
			}
239
			if (dynClasses.get(dynClass.getFullName()) != null) {
240
				throw new DuplicateDynClassException(parser,
241
						dynClass.getFullName());
242
			}
243
			dynClasses.put(dynClass.getFullName(), dynClass);
244
		}
245
		parser.require(XmlPullParser.END_TAG, "", CLASSES_TAG);
246
		parser.nextTag();
151
        public Object get(Object theName) {
152
            DynClass definition;
153
            definition = (DynClass) super.get(((String) theName).toLowerCase());
154
            if ( definition != null ) {
155
                return definition;
156
            }
157
            // No ha encontrado la clase pedida, podria ser que el namespace
158
            // no coincida, vamos a buscarla ignorando el namespace en caso
159
            // de que este no se haya indicado.
160
            DynClassName name = manager.createDynClassName((String) theName);
161
            if ( name.getNamespace() == null ) {
162
                // No han especificado namespace, asi que busco la primera
163
                // que tenga como nombre el indicado independientemente del
164
                // namespace que tenga.
165
                Iterator it = this.values().iterator();
166
                while ( it.hasNext() ) {
167
                    definition = (DynClass) it.next();
168
                    if ( definition.getName().equalsIgnoreCase(name.getName()) ) {
169
                        return definition;
170
                    }
171
                }
172
            } else {
173
                // Han especificaso un namespace, asi que voy a buscar una que
174
                // no tenga namespace y su nombre concuerde.
175
                Iterator it = this.values().iterator();
176
                while ( it.hasNext() ) {
177
                    definition = (DynClass) it.next();
178
                    if ( definition.getNamespace() == null
179
                            && definition.getName().equalsIgnoreCase(
180
                                    name.getName()) ) {
181
                        return definition;
182
                    }
183
                }
184
            }
185
            return null;
186
        }
247 187

  
248
		parser.require(XmlPullParser.END_TAG, "", DEFINITIONS_TAG);
249
		parser.next();
188
        public boolean containsKey(Object key) {
189
            String lowerKey = ((String) key).toLowerCase();
190
            if ( super.containsKey(lowerKey) ) {
191
                return true;
192
            }
193
            Object value = this.get(lowerKey);
194
            return value != null;
195
        }
196
    }
250 197

  
251
		parser.require(XmlPullParser.END_DOCUMENT, null, null);
252
		LOG.debug("Imported classes {}", new Object[] { getKeys(dynClasses) });
253
		return dynClasses;
254
	}
198
    public Map importDefinitions(XmlPullParser parser, ClassLoader loader,
199
            String defaultNamespace) throws XmlPullParserException, IOException {
200
        dynClasses = new Definitions();
201
        String version = null;
255 202

  
256
	private String getKeys(Map theMap) {
257
		List l = new ArrayList(theMap.keySet());
258
		return l.toString();
259
	}
203
        if ( loader == null ) {
204
            loader = this.getClass().getClassLoader();
205
        }
206
        parser.nextTag();
207
        parser.require(XmlPullParser.START_TAG, null, DEFINITIONS_TAG);
208
        for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
209
            String name = parser.getAttributeName(i);
210
            if ( name.equalsIgnoreCase(VERSION_TAG) ) {
211
                version = this.getAttributeValue(parser, i);
212
            } else {
213
                throw new WrongVersionException(parser);
214
            }
215
        }
216
        parser.nextTag();
217
        if ( parser.getName().equalsIgnoreCase(VERSION_TAG) ) {
218
            parser.require(XmlPullParser.START_TAG, null, VERSION_TAG);
219
            version = parser.nextText();
220
            if ( !version.trim().equals(VERSION_VALUE) ) {
221
                throw new UnsupportedClassVersionError();
222
            }
223
            parser.require(XmlPullParser.END_TAG, "", VERSION_TAG);
224
            parser.nextTag();
225
        }
260 226

  
261
	private DynClass importDynClass(XmlPullParser parser, ClassLoader loader,
262
			String defaultNamespace, Map classes)
263
			throws XmlPullParserException, IOException {
264
		DynObjectManager manager = ToolsLocator.getDynObjectManager();
265
		DynClass dynClass;
266
		List superClasses = new ArrayList();
267
		Map values = new HashMap();
268
		List tagsValues = null;
227
        parser.require(XmlPullParser.START_TAG, "", CLASSES_TAG);
228
        parser.nextTag();
229
        while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
230
                .getName().equals(CLASSES_TAG)) ) {
231
            checkEndDocument(parser);
232
            DynClass dynClass = importDynClass(parser, loader,
233
                    defaultNamespace, dynClasses);
234
            try {
235
                ((DefaultDynClass) dynClass).check();
236
            } catch (ListBaseException e) {
237
                throw new DynObjectRuntimeException(e);
238
            }
239
            if ( dynClasses.get(dynClass.getFullName()) != null ) {
240
                throw new DuplicateDynClassException(parser,
241
                        dynClass.getFullName());
242
            }
243
            dynClasses.put(dynClass.getFullName(), dynClass);
244
        }
245
        parser.require(XmlPullParser.END_TAG, "", CLASSES_TAG);
246
        parser.nextTag();
269 247

  
270
		parser.require(XmlPullParser.START_TAG, null, CLASS_TAG);
271
		//
272
		// Collect class attributes from tag attributes
273
		//
274
		for (int i = 0; i < parser.getAttributeCount(); i++) {
275
			values.put(parser.getAttributeName(i),
276
					this.getAttributeValue(parser, i));
277
		}
278
		parser.nextTag();
248
        parser.require(XmlPullParser.END_TAG, "", DEFINITIONS_TAG);
249
        parser.next();
279 250

  
280
		while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
281
				.getName().equals(CLASSES_TAG))) {
282
			checkEndDocument(parser);
251
        parser.require(XmlPullParser.END_DOCUMENT, null, null);
252
        LOG.debug("Imported classes {}", new Object[]{getKeys(dynClasses)});
253
        return dynClasses;
254
    }
283 255

  
284
			parser.require(XmlPullParser.START_TAG, null, null);
285
			String tagName = parser.getName();
286
			if (tagName.equalsIgnoreCase(CLASS_DESCRIPTION_TAG)) {
287
				values.put(CLASS_DESCRIPTION_TAG, this.nextText(parser));
256
    private String getKeys(Map theMap) {
257
        List l = new ArrayList(theMap.keySet());
258
        return l.toString();
259
    }
288 260

  
289
			} else if (tagName.equalsIgnoreCase(CLASS_NAME_TAG)) {
290
				values.put(CLASS_NAME_TAG, this.nextText(parser));
261
    private DynClass importDynClass(XmlPullParser parser, ClassLoader loader,
262
            String defaultNamespace, Map classes)
263
            throws XmlPullParserException, IOException {
264
        DynObjectManager manager = ToolsLocator.getDynObjectManager();
265
        DynClass dynClass;
266
        List superClasses = new ArrayList();
267
        Map values = new HashMap();
268
        List tagsValues = null;
291 269

  
292
			} else if (tagName.equalsIgnoreCase(CLASS_NAMESPACE_TAG)) {
293
				values.put(CLASS_NAMESPACE_TAG, this.nextText(parser));
270
        parser.require(XmlPullParser.START_TAG, null, CLASS_TAG);
271
        //
272
        // Collect class attributes from tag attributes
273
        //
274
        for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
275
            values.put(parser.getAttributeName(i),
276
                    this.getAttributeValue(parser, i));
277
        }
278
        parser.nextTag();
294 279

  
295
			} else if (tagName.equalsIgnoreCase(CLASS_SUPERCLASSNAMES_TAG)) {
296
				parser.nextTag();
297
				while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
298
						.getName().equals(CLASS_SUPERCLASSNAMES_TAG))) {
299
					checkEndDocument(parser);
300
					parser.require(XmlPullParser.START_TAG, "",
301
							CLASS_SUPERCLASSNAME_TAG);
302
					superClasses.add(manager.createDynClassName(
303
							defaultNamespace, this.nextText(parser)));
304
					parser.require(XmlPullParser.END_TAG, null,
305
							CLASS_SUPERCLASSNAME_TAG);
306
					parser.nextTag();
307
				}
280
        while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
281
                .getName().equals(CLASSES_TAG)) ) {
282
            checkEndDocument(parser);
308 283

  
309
			} else if (tagName.equalsIgnoreCase(CLASS_EXTENDS_TAG)) {
310
				parser.nextTag();
311
				while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
312
						.getName().equals(CLASS_EXTENDS_TAG))) {
313
					checkEndDocument(parser);
314
					superClasses
315
							.add(importSuperClass(parser, defaultNamespace));
316
					parser.nextTag();
317
				}
318
				
319
			} else if (tagName.equalsIgnoreCase(FIELD_TAGS_TAG)) {
320
				parser.nextTag();
321
				tagsValues = new ArrayList();
322
				while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
323
						.getName().equals(FIELD_TAGS_TAG))) {
324
					checkEndDocument(parser);
325
					tagsValues.add(importValueItem(parser, VALUEITEM_TAGNAME_TAG));
326
					parser.nextTag();
327
				}
284
            parser.require(XmlPullParser.START_TAG, null, null);
285
            String tagName = parser.getName();
286
            if ( tagName.equalsIgnoreCase(CLASS_DESCRIPTION_TAG) ) {
287
                values.put(CLASS_DESCRIPTION_TAG, this.nextText(parser));
328 288

  
329
			} else {
330
				break;
331
			}
332
			parser.require(XmlPullParser.END_TAG, null, tagName);
333
			parser.nextTag();
334
		}
335
		parser.require(XmlPullParser.START_TAG, null, CLASS_FIELDS_TAG);
336
		parser.nextTag();
289
            } else if ( tagName.equalsIgnoreCase(CLASS_NAME_TAG) ) {
290
                values.put(CLASS_NAME_TAG, this.nextText(parser));
337 291

  
338
		//
339
		// Create dynclass
340
		//
341
		if (values.get(CLASS_NAME_TAG) == null) {
342
			throw new NeedTagOrAttributeException(parser, CLASS_NAME_TAG);
343
		}
344
		if (values.get(CLASS_NAMESPACE_TAG) == null) {
345
			values.put(CLASS_NAMESPACE_TAG, defaultNamespace);
346
		}
347
		dynClass = manager.createDynClass(
348
				(String) values.get(CLASS_NAMESPACE_TAG),
349
				(String) values.get(CLASS_NAME_TAG),
350
				(String) values.get(CLASS_DESCRIPTION_TAG));
351
		for (int i = 0; i < superClasses.size(); i++) {
352
			DynClassName superClass = (DynClassName) superClasses.get(i);
353
			if (superClass.getName() == null) {
354
				throw new NeedTagOrAttributeException(parser, CLASS_NAME_TAG);
355
			}
356
			DynClass superDynClass = (DynClass) classes.get(superClass
357
					.getFullName());
358
			if (superDynClass == null) {
359
				superDynClass = ToolsLocator.getDynObjectManager().get(
360
						superClass.getNamespace(), superClass.getName());
361
				if (superDynClass == null) {
362
					throw new CantLocateDynClassException(parser,
363
							superClass.getFullName());
364
				}
365
			}
366
			dynClass.extend(superDynClass);
367
		}
368
		if (tagsValues != null && !tagsValues.isEmpty()) {
369
                        if( dynClass instanceof DynClass_v2 ) {
370
                            for (int i = 0; i < tagsValues.size(); i++) {
371
                                    PairValueLabel pair = (PairValueLabel) tagsValues.get(i);
372
                                    if (pair.label != null) {
373
                                            ((DynClass_v2)dynClass).getTags().set(pair.label, pair.value);
374
                                    }
375
                            }
376
                        }
377
		}		
378
		//
379
		// Parse and load fields of dynclass
380
		//
381
		while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
382
				.getName().equals(CLASS_FIELDS_TAG))) {
383
			checkEndDocument(parser);
384
			importDynField(parser, dynClass, loader);
385
			parser.nextTag();
386
		}
387
		parser.require(XmlPullParser.END_TAG, null, CLASS_FIELDS_TAG);
388
		parser.nextTag();
292
            } else if ( tagName.equalsIgnoreCase(CLASS_NAMESPACE_TAG) ) {
293
                values.put(CLASS_NAMESPACE_TAG, this.nextText(parser));
389 294

  
390
		parser.require(XmlPullParser.END_TAG, null, CLASS_TAG);
391
		parser.nextTag();
392
		return dynClass;
393
	}
295
            } else if ( tagName.equalsIgnoreCase(CLASS_SUPERCLASSNAMES_TAG) ) {
296
                parser.nextTag();
297
                while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
298
                        .getName().equals(CLASS_SUPERCLASSNAMES_TAG)) ) {
299
                    checkEndDocument(parser);
300
                    parser.require(XmlPullParser.START_TAG, "",
301
                            CLASS_SUPERCLASSNAME_TAG);
302
                    superClasses.add(manager.createDynClassName(
303
                            defaultNamespace, this.nextText(parser)));
304
                    parser.require(XmlPullParser.END_TAG, null,
305
                            CLASS_SUPERCLASSNAME_TAG);
306
                    parser.nextTag();
307
                }
394 308

  
395
	private DynClassName importSuperClass(XmlPullParser parser,
396
			String defaultNamespace) throws XmlPullParserException, IOException {
309
            } else if ( tagName.equalsIgnoreCase(CLASS_EXTENDS_TAG) ) {
310
                parser.nextTag();
311
                while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
312
                        .getName().equals(CLASS_EXTENDS_TAG)) ) {
313
                    checkEndDocument(parser);
314
                    superClasses
315
                            .add(importSuperClass(parser, defaultNamespace));
316
                    parser.nextTag();
317
                }
397 318

  
398
		String name = null;
399
		String namespace = defaultNamespace;
319
            } else if ( tagName.equalsIgnoreCase(FIELD_TAGS_TAG) ) {
320
                parser.nextTag();
321
                tagsValues = new ArrayList();
322
                while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
323
                        .getName().equals(FIELD_TAGS_TAG)) ) {
324
                    checkEndDocument(parser);
325
                    tagsValues.add(importValueItem(parser, VALUEITEM_TAGNAME_TAG));
326
                    parser.nextTag();
327
                }
400 328

  
401
		parser.require(XmlPullParser.START_TAG, null, CLASS_EXTENDS_CLASS_TAG);
402
		for (int i = 0; i < parser.getAttributeCount(); i++) {
403
			String attrname = parser.getAttributeName(i);
404
			if (attrname.equalsIgnoreCase(CLASS_NAME_TAG)) {
405
				name = this.getAttributeValue(parser, i);
406
			} else if (attrname.equalsIgnoreCase(CLASS_NAMESPACE_TAG)) {
407
				namespace = this.getAttributeValue(parser, i);
408
			} else {
409
				throw new UnexpectedTagOrAttributeException(parser, attrname);
410
			}
411
		}
412
		if (name == null) {
413
			name = this.nextText(parser);
414
		} else {
415
			parser.nextTag();
416
		}
417
		parser.require(XmlPullParser.END_TAG, null, CLASS_EXTENDS_CLASS_TAG);
418
		DynClassName dynClassName = manager.createDynClassName(namespace, name);
419
		return dynClassName;
420
	}
329
            } else {
330
                break;
331
            }
332
            parser.require(XmlPullParser.END_TAG, null, tagName);
333
            parser.nextTag();
334
        }
335
        parser.require(XmlPullParser.START_TAG, null, CLASS_FIELDS_TAG);
336
        parser.nextTag();
421 337

  
422
	private void importDynField(XmlPullParser parser, DynClass dynClass,
423
			ClassLoader loader) throws XmlPullParserException, IOException {
424
		DynField_v2 field;
425
		List availableValues = null;
426
		List tagsValues = null;
427
		Map values = new HashMap();
338
        //
339
        // Create dynclass
340
        //
341
        if ( values.get(CLASS_NAME_TAG) == null ) {
342
            throw new NeedTagOrAttributeException(parser, CLASS_NAME_TAG);
343
        }
344
        if ( values.get(CLASS_NAMESPACE_TAG) == null ) {
345
            values.put(CLASS_NAMESPACE_TAG, defaultNamespace);
346
        }
347
        dynClass = manager.createDynClass(
348
                (String) values.get(CLASS_NAMESPACE_TAG),
349
                (String) values.get(CLASS_NAME_TAG),
350
                (String) values.get(CLASS_DESCRIPTION_TAG));
351
        for ( int i = 0; i < superClasses.size(); i++ ) {
352
            DynClassName superClass = (DynClassName) superClasses.get(i);
353
            if ( superClass.getName() == null ) {
354
                throw new NeedTagOrAttributeException(parser, CLASS_NAME_TAG);
355
            }
356
            DynClass superDynClass = (DynClass) classes.get(superClass
357
                    .getFullName());
358
            if ( superDynClass == null ) {
359
                superDynClass = ToolsLocator.getDynObjectManager().get(
360
                        superClass.getNamespace(), superClass.getName());
361
                if ( superDynClass == null ) {
362
                    throw new CantLocateDynClassException(parser,
363
                            superClass.getFullName());
364
                }
365
            }
366
            dynClass.extend(superDynClass);
367
        }
368
        if ( tagsValues != null && !tagsValues.isEmpty() ) {
369
            if ( dynClass instanceof DynClass_v2 ) {
370
                for ( int i = 0; i < tagsValues.size(); i++ ) {
371
                    PairValueLabel pair = (PairValueLabel) tagsValues.get(i);
372
                    if ( pair.label != null ) {
373
                        ((DynClass_v2) dynClass).getTags().set(pair.label, pair.value);
374
                    }
375
                }
376
            }
377
        }
378
        //
379
        // Parse and load fields of dynclass
380
        //
381
        while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
382
                .getName().equals(CLASS_FIELDS_TAG)) ) {
383
            checkEndDocument(parser);
384
            importDynField(parser, (DynClass_v2) dynClass, loader);
385
            parser.nextTag();
386
        }
387
        parser.require(XmlPullParser.END_TAG, null, CLASS_FIELDS_TAG);
388
        parser.nextTag();
428 389

  
429
		parser.require(XmlPullParser.START_TAG, null, FIELD_TAG);
430
		//
431
		// Collect field attributes from tag attributes
432
		//
433
		for (int i = 0; i < parser.getAttributeCount(); i++) {
434
			values.put(parser.getAttributeName(i),
435
					this.getAttributeValue(parser, i));
436
		}
437
		parser.nextTag();
390
        parser.require(XmlPullParser.END_TAG, null, CLASS_TAG);
391
        parser.nextTag();
392
        return dynClass;
393
    }
438 394

  
439
		//
440
		// Collect field attributes from tags
441
		//
442
		while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
443
				.getName().equals(FIELD_TAG))) {
444
			checkEndDocument(parser);
395
    private DynClassName importSuperClass(XmlPullParser parser,
396
            String defaultNamespace) throws XmlPullParserException, IOException {
445 397

  
446
			parser.require(XmlPullParser.START_TAG, null, null);
447
			String name = parser.getName();
448
			if (name.equalsIgnoreCase(FIELD_NAME_TAG)) {
449
				values.put(FIELD_NAME_TAG, this.nextText(parser));
398
        String name = null;
399
        String namespace = defaultNamespace;
450 400

  
451
			} else if (name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG)) {
452
				values.put(FIELD_DESCRIPTION_TAG, this.nextText(parser));
401
        parser.require(XmlPullParser.START_TAG, null, CLASS_EXTENDS_CLASS_TAG);
402
        for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
403
            String attrname = parser.getAttributeName(i);
404
            if ( attrname.equalsIgnoreCase(CLASS_NAME_TAG) ) {
405
                name = this.getAttributeValue(parser, i);
406
            } else if ( attrname.equalsIgnoreCase(CLASS_NAMESPACE_TAG) ) {
407
                namespace = this.getAttributeValue(parser, i);
408
            } else {
409
                throw new UnexpectedTagOrAttributeException(parser, attrname);
410
            }
411
        }
412
        if ( name == null ) {
413
            name = this.nextText(parser);
414
        } else {
415
            parser.nextTag();
416
        }
417
        parser.require(XmlPullParser.END_TAG, null, CLASS_EXTENDS_CLASS_TAG);
418
        DynClassName dynClassName = manager.createDynClassName(namespace, name);
419
        return dynClassName;
420
    }
453 421

  
454
			} else if (name.equalsIgnoreCase(FIELD_TYPE_TAG)) {
455
				values.put(FIELD_TYPE_TAG, this.nextText(parser));
422
    private void importDynField(XmlPullParser parser, DynClass_v2 dynClass,
423
            ClassLoader loader) throws XmlPullParserException, IOException {
424
        DynField_v2 field;
425
        List availableValues = null;
426
        List tagsValues = null;
427
        Map values = new LinkedHashMap();
456 428

  
457
			} else if (name.equalsIgnoreCase(FIELD_SUBTYPE_TAG)) {
458
				values.put(FIELD_SUBTYPE_TAG, this.nextText(parser));
429
        parser.require(XmlPullParser.START_TAG, null, FIELD_TAG);
430
        //
431
        // Collect field attributes from tag attributes
432
        //
433
        for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
434
            values.put(parser.getAttributeName(i),
435
                    this.getAttributeValue(parser, i));
436
        }
437
        parser.nextTag();
459 438

  
460
			} else if (name.equalsIgnoreCase(FIELD_GROUP_TAG)) {
461
				values.put(FIELD_GROUP_TAG, this.nextText(parser));
439
        //
440
        // Collect field attributes from tags
441
        //
442
        while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
443
                .getName().equals(FIELD_TAG)) ) {
444
            checkEndDocument(parser);
462 445

  
463
			} else if (name.equalsIgnoreCase(FIELD_LABEL_TAG)) {
464
				values.put(FIELD_LABEL_TAG, this.nextText(parser));
446
            parser.require(XmlPullParser.START_TAG, null, null);
447
            String name = parser.getName();
448
            if ( name.equalsIgnoreCase(FIELD_NAME_TAG) ) {
449
                values.put(FIELD_NAME_TAG, this.nextText(parser));
465 450

  
466
			} else if (name.equalsIgnoreCase(FIELD_ORDER_TAG)) {
467
				values.put(FIELD_ORDER_TAG, this.nextText(parser));
451
            } else if ( name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG) ) {
452
                values.put(FIELD_DESCRIPTION_TAG, this.nextText(parser));
468 453

  
469
			} else if (name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG)) {
470
				values.put(FIELD_ISMANDATORY_TAG, this.nextText(parser));
454
            } else if ( name.equalsIgnoreCase(FIELD_TYPE_TAG) ) {
455
                values.put(FIELD_TYPE_TAG, this.nextText(parser));
471 456

  
472
			} else if (name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG)) {
473
				values.put(FIELD_ISPERSISTENT_TAG, this.nextText(parser));
457
            } else if ( name.equalsIgnoreCase(FIELD_SUBTYPE_TAG) ) {
458
                values.put(FIELD_SUBTYPE_TAG, this.nextText(parser));
474 459

  
475
			} else if (name.equalsIgnoreCase(FIELD_MINVALUE_TAG)) {
476
				values.put(FIELD_MINVALUE_TAG, this.nextText(parser));
460
            } else if ( name.equalsIgnoreCase(FIELD_GROUP_TAG) ) {
461
                values.put(FIELD_GROUP_TAG, this.nextText(parser));
477 462

  
478
			} else if (name.equalsIgnoreCase(FIELD_MAXVALUE_TAG)) {
479
				values.put(FIELD_MAXVALUE_TAG, this.nextText(parser));
463
            } else if ( name.equalsIgnoreCase(FIELD_LABEL_TAG) ) {
464
                values.put(FIELD_LABEL_TAG, this.nextText(parser));
480 465

  
481
			} else if (name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG)) {
482
				values.put(FIELD_CLASSOFVALUE_TAG, this.nextText(parser));
466
            } else if ( name.equalsIgnoreCase(FIELD_ORDER_TAG) ) {
467
                values.put(FIELD_ORDER_TAG, this.nextText(parser));
483 468

  
484
			} else if (name.equalsIgnoreCase(FIELD_CLASSOFITEMS_TAG)) {
485
				values.put(FIELD_CLASSOFITEMS_TAG, this.nextText(parser));
469
            } else if ( name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG) ) {
470
                values.put(FIELD_ISMANDATORY_TAG, this.nextText(parser));
486 471

  
487
			} else if (name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG)) {
488
				values.put(FIELD_DEFAULTVALUE_TAG, this.nextText(parser));
472
            } else if ( name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG) ) {
473
                values.put(FIELD_ISPERSISTENT_TAG, this.nextText(parser));
489 474

  
490
			} else if (name.equalsIgnoreCase(FIELD_HIDDEN_TAG)) {
491
				values.put(FIELD_HIDDEN_TAG, this.nextText(parser));
475
            } else if ( name.equalsIgnoreCase(FIELD_MINVALUE_TAG) ) {
476
                values.put(FIELD_MINVALUE_TAG, this.nextText(parser));
492 477

  
493
			} else if (name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG)) {
494
				parser.nextTag();
495
				availableValues = new ArrayList();
496
				while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
497
						.getName().equals(FIELD_AVALILABLEVALUES_TAG))) {
498
					checkEndDocument(parser);
499
					availableValues.add(importValueItem(parser, VALUEITEM_LABEL_TAG));
500
					parser.nextTag();
501
				}
478
            } else if ( name.equalsIgnoreCase(FIELD_MAXVALUE_TAG) ) {
479
                values.put(FIELD_MAXVALUE_TAG, this.nextText(parser));
502 480

  
503
			} else if (name.equalsIgnoreCase(FIELD_TAGS_TAG)) {
504
				parser.nextTag();
505
				tagsValues = new ArrayList();
506
				while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
507
						.getName().equals(FIELD_TAGS_TAG))) {
508
					checkEndDocument(parser);
509
					tagsValues.add(importValueItem(parser, VALUEITEM_TAGNAME_TAG));
510
					parser.nextTag();
511
				}
481
            } else if ( name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG) ) {
482
                values.put(FIELD_CLASSOFVALUE_TAG, this.nextText(parser));
512 483

  
513
			} else {
514
				break;
515
			}
516
			parser.require(XmlPullParser.END_TAG, null, name);
517
			parser.nextTag();
518
		}
519
		parser.require(XmlPullParser.END_TAG, null, FIELD_TAG);
484
            } else if ( name.equalsIgnoreCase(FIELD_CLASSOFITEMS_TAG) ) {
485
                values.put(FIELD_CLASSOFITEMS_TAG, this.nextText(parser));
520 486

  
521
		if (values.get(FIELD_NAME_TAG) == null) {
522
			throw new NeedTagOrAttributeException(parser, FIELD_NAME_TAG);
523
		}
487
            } else if ( name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG) ) {
488
                values.put(FIELD_DEFAULTVALUE_TAG, this.nextText(parser));
524 489

  
525
		//
526
		// Create the field
527
		//
528
		field = (DynField_v2) dynClass.addDynField((String) values.get(FIELD_NAME_TAG));
490
            } else if ( name.equalsIgnoreCase(FIELD_HIDDEN_TAG) ) {
491
                values.put(FIELD_HIDDEN_TAG, this.nextText(parser));
529 492

  
530
		//
531
		// Setting type and subtype first
532
		//
493
            } else if ( name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG) ) {
494
                parser.nextTag();
495
                availableValues = new ArrayList();
496
                while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
497
                        .getName().equals(FIELD_AVALILABLEVALUES_TAG)) ) {
498
                    checkEndDocument(parser);
499
                    availableValues.add(importValueItem(parser, VALUEITEM_LABEL_TAG));
500
                    parser.nextTag();
501
                }
533 502

  
534
		String name = FIELD_TYPE_TAG;
535
		String value = (String) values.get(name);
536
		if (value != null) {
537
			int type = ToolsLocator.getDataTypesManager().getType(value);
538
			if (type == DataTypes.INVALID) {
539
				throw new InvalidFieldTypeException(parser, value);
540
			}
541
			field.setType(type);
542
			name = FIELD_CLASSOFVALUE_TAG;
543
			value = (String) values.get(name);
544
			if (value != null) {
545
				try {
546
					Class klass;
547
					LOG.debug("Intentando cargar clase '" + value + "'.");
548
					klass = Class.forName(value, true, loader);
549
					field.setClassOfValue(klass);
550
				} catch (DynFieldIsNotAContainerException e) {
551
					LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
552
					throw new IncompatibleAttributeValueException(parser,
553
							FIELD_NAME_TAG);
554
				} catch (ClassNotFoundException e) {
555
					LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
556
					throw new CantLocateClassException(parser, FIELD_NAME_TAG);
557
				}
558
			}
559
			name = FIELD_CLASSOFITEMS_TAG;
560
			value = (String) values.get(name);
561
			if (value != null) {
562
				try {
563
					Class klass;
564
					klass = Class.forName(value, true, loader);
565
					field.setClassOfValue(klass);
566
				} catch (DynFieldIsNotAContainerException e) {
567
					throw new IncompatibleAttributeValueException(parser,
568
                        FIELD_NAME_TAG, value);
569
				} catch (ClassNotFoundException e) {
570
                    throw new CantLocateClassException(parser, FIELD_NAME_TAG,
571
                        value);
572
				}
573
			}
574
		}
503
            } else if ( name.equalsIgnoreCase(FIELD_TAGS_TAG) ) {
504
                parser.nextTag();
505
                tagsValues = new ArrayList();
506
                while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
507
                        .getName().equals(FIELD_TAGS_TAG)) ) {
508
                    checkEndDocument(parser);
509
                    tagsValues.add(importValueItem(parser, VALUEITEM_TAGNAME_TAG));
510
                    parser.nextTag();
511
                }
575 512

  
576
		name = FIELD_SUBTYPE_TAG;
577
		value = (String) values.get(name);
578
		if (value != null) {
579
			try {
580
				field.setSubtype(value);
581
			} catch (IllegalArgumentException e) {
582
				// Ignore exception
583
			}
584
		}
513
            } else {
514
                break;
515
            }
516
            parser.require(XmlPullParser.END_TAG, null, name);
517
            parser.nextTag();
518
        }
519
        parser.require(XmlPullParser.END_TAG, null, FIELD_TAG);
585 520

  
586
		//
587
		// Load other values in the field
588
		//
589
		Iterator names = values.keySet().iterator();
590
		while (names.hasNext()) {
591
			name = (String) names.next();
592
			value = (String) values.get(name);
593
			if (value == null) {
594
				continue;
595
			}
596
			if (name.equalsIgnoreCase(FIELD_NAME_TAG)) {
597
				// Do nothing
521
        if ( values.get(FIELD_NAME_TAG) == null ) {
522
            throw new NeedTagOrAttributeException(parser, FIELD_NAME_TAG);
523
        }
598 524

  
599
			} else if (name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG)) {
600
				field.setDescription(value);
525
        
601 526

  
602
			} else if (name.equalsIgnoreCase(FIELD_TYPE_TAG)) {
603
				// Do nothing
604
			} else if (name.equalsIgnoreCase(FIELD_SUBTYPE_TAG)) {
605
				// Do nothing
606
			} else if (name.equalsIgnoreCase(FIELD_GROUP_TAG)) {
607
				field.setGroup(value);
527
        //
528
        // Get type and subtype first
529
        //
530
        String name = FIELD_TYPE_TAG;
531
        String value = (String) values.get(name);
532
        if ( value == null ) {
533
            throw new InvalidFieldTypeException(parser, value);
534
        }
535
        int type = ToolsLocator.getDataTypesManager().getType(value);
536
        if ( type == DataTypes.INVALID ) {
537
            throw new InvalidFieldTypeException(parser, value);
538
        }
539
        //
540
        // Create the field
541
        //
542
        field = (DynField_v2) dynClass.addDynField((String) values.get(FIELD_NAME_TAG),type);
608 543

  
609
			} else if (name.equalsIgnoreCase(FIELD_LABEL_TAG)) {
610
				this.manager.setAttributeValue(field, "label", value);
544
        //
545
        // Load other values in the field
546
        //
547
        Iterator names = values.keySet().iterator();
548
        while ( names.hasNext() ) {
549
            name = (String) names.next();
550
            value = (String) values.get(name);
551
            if ( value == null ) {
552
                continue;
553
            }
554
            if ( name.equalsIgnoreCase(FIELD_NAME_TAG) ) {
555
                // Do nothing
611 556

  
612
			} else if (name.equalsIgnoreCase(FIELD_ORDER_TAG)) {
613
				field.setOrder(Integer.parseInt(value));
557
            } else if ( name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG) ) {
558
                field.setDescription(value);
614 559

  
615
			} else if (name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG)) {
616
				field.setMandatory(new Boolean(value).booleanValue());
560
            } else if ( name.equalsIgnoreCase(FIELD_TYPE_TAG) ) {
561
                // Do nothing
562
            } else if ( name.equalsIgnoreCase(FIELD_SUBTYPE_TAG) ) {
563
                field.setSubtype(value);
564
                
565
            } else if ( name.equalsIgnoreCase(FIELD_GROUP_TAG) ) {
566
                field.setGroup(value);
617 567

  
618
			} else if (name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG)) {
619
				field.setPersistent(new Boolean(value).booleanValue());
568
            } else if ( name.equalsIgnoreCase(FIELD_LABEL_TAG) ) {
569
                this.manager.setAttributeValue(field, "label", value);
620 570

  
621
			} else if (name.equalsIgnoreCase(FIELD_HIDDEN_TAG)) {
622
				field.setHidden(new Boolean(value).booleanValue());
571
            } else if ( name.equalsIgnoreCase(FIELD_ORDER_TAG) ) {
572
                field.setOrder(Integer.parseInt(value));
623 573

  
624
			} else if (name.equalsIgnoreCase(FIELD_MINVALUE_TAG)) {
625
				field.setMinValue(value);
574
            } else if ( name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG) ) {
575
                field.setMandatory(new Boolean(value).booleanValue());
626 576

  
627
			} else if (name.equalsIgnoreCase(FIELD_MAXVALUE_TAG)) {
628
				field.setMaxValue(value);
629
				
630
			} else if (name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG)) {
631
				field.setDefaultFieldValue(value);
577
            } else if ( name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG) ) {
578
                field.setPersistent(new Boolean(value).booleanValue());
632 579

  
633
			} else if (name.equalsIgnoreCase(FIELD_ELEMENTTYPE_TAG)) {
634
				DynClass dynStruct = (DynClass) dynClasses.get(value);
635
				if(dynStruct==null){
636
					dynStruct = this.manager.get(value);
637
				}
638
				if(dynStruct==null){
639
					LOG.warn("No se ha encontrado la dynClass '" + value + "'.");
640
					throw new IncompatibleAttributeValueException(parser,
641
							FIELD_ELEMENTTYPE_TAG);
642
				}
643
				field.setElementsType(dynStruct);
580
            } else if ( name.equalsIgnoreCase(FIELD_HIDDEN_TAG) ) {
581
                field.setHidden(new Boolean(value).booleanValue());
644 582

  
645
			} else if (name.equalsIgnoreCase(FIELD_STRUCTUSEDWHENISDYNOBJECT_TAG)) {
646
				DynClass dynStruct = (DynClass) dynClasses.get(value);
647
				if(dynStruct==null){
648
					dynStruct = this.manager.get(value);
649
				}
650
				if(dynStruct==null){
651
					LOG.warn("No se ha encontrado la dynClass '" + value + "'.");
652
					throw new IncompatibleAttributeValueException(parser,
653
							FIELD_STRUCTUSEDWHENISDYNOBJECT_TAG);
654
				}
655
				field.setStructWhenTypeIsDynObject(dynStruct);
583
            } else if ( name.equalsIgnoreCase(FIELD_MINVALUE_TAG) ) {
584
                field.setMinValue(value);
656 585

  
657
			} else if (name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG)) {
658
				// Do nothing
586
            } else if ( name.equalsIgnoreCase(FIELD_MAXVALUE_TAG) ) {
587
                field.setMaxValue(value);
659 588

  
660
			} else if (name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG)) {
661
				// Do nothing
589
            } else if ( name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG) ) {
590
                field.setDefaultFieldValue(value);
662 591

  
663
			} else if (name.equalsIgnoreCase(FIELD_CLASSOFITEMS_TAG)) {
664
				// Do nothing
592
            } else if ( name.equalsIgnoreCase(FIELD_TYPEOFITEMS_TAG) ) {
593
                int typeOfItems = ToolsLocator.getDataTypesManager().getType(value);
594
                if ( typeOfItems == DataTypes.INVALID ) {
595
                    throw new InvalidFieldTypeException(parser, value);
596
                }
597
                field.setTypeOfItems(typeOfItems);
665 598

  
666
			} else {
667
				throw new UnexpectedTagOrAttributeException(parser, name);
668
			}
669
		}
599
            } else if ( name.equalsIgnoreCase(FIELD_CLASSOFITEMS_TAG) ) {
600
                if( field.getTypeOfItems()==DataTypes.DYNOBJECT ) {
601
                    DynClass dynStruct = (DynClass) dynClasses.get(value);
602
                    if ( dynStruct == null ) {
603
                        // Try to search in registered DynClasses
604
                        field.setClassOfItems(value);
605
                    } else {
606
                        field.setClassOfItems(dynStruct);
607
                    }
608
                } else {
609
                    try {
610
                        Class klass;
611
                        klass = Class.forName(value, true, loader);
612
                        field.setClassOfItems(klass);
613
                    } catch (DynFieldIsNotAContainerException e) {
614
                        LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
615
                        throw new IncompatibleAttributeValueException(parser,
616
                                FIELD_NAME_TAG);
617
                    } catch (ClassNotFoundException e) {
618
                        LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
619
                        throw new CantLocateClassException(parser, FIELD_NAME_TAG);
620
                    }
621
                }
670 622

  
671
		try {
672
			//
673
			// Coerce the min/max/default/available values to the type of
674
			// the field
675
			//
676
			if (availableValues != null && !availableValues.isEmpty()) {
677
				for (int i = 0; i < availableValues.size(); i++) {
678
					PairValueLabel pair = (PairValueLabel) availableValues
679
							.get(i);
680
					if (pair.label == null) {
681
						if (pair.value == null) {
682
							pair.label = "null";
683
						} else {
684
							pair.label = pair.value.toString();
685
						}
686
					}
687
					availableValues.set(i,
688
							new DynObjectValueItem(field.coerce(pair.value),
689
									pair.label));
690
				}
691
				field.setAvailableValues(availableValues);
692
			}
693
			if (tagsValues != null && !tagsValues.isEmpty()) {
694
				for (int i = 0; i < tagsValues.size(); i++) {
695
					PairValueLabel pair = (PairValueLabel) tagsValues.get(i);
696
					if (pair.label != null) {
697
						field.getTags().set(pair.label, pair.value);
698
					}
699
				}
700
			}			
701
			field.setMaxValue(field.coerce(values.get(FIELD_MAXVALUE_TAG)));
702
			field.setMinValue(field.coerce(values.get(FIELD_MINVALUE_TAG)));
703
			field.setDefaultFieldValue(field.coerce(values
704
					.get(FIELD_DEFAULTVALUE_TAG)));
705
		} catch (CoercionException e) {
706
			throw new ParseCoerceException(e, parser);
707
		}
708
	}
623
            } else if ( name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG) ) {
624
                if( field.getType()==DataTypes.DYNOBJECT ) {
625
                    DynClass dynStruct = (DynClass) dynClasses.get(value);
626
                    if ( dynStruct == null ) {
627
                        // Try to search in registered DynClasses
628
                        field.setClassOfValue(value);
629
                    } else {
630
                        field.setClassOfValue(dynStruct);
631
                    }
632
                } else {
633
                    try {
634
                        Class klass;
635
                        klass = Class.forName(value, true, loader);
636
                        field.setClassOfValue(klass);
637
                    } catch (DynFieldIsNotAContainerException e) {
638
                        LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
639
                        throw new IncompatibleAttributeValueException(parser,
640
                                FIELD_NAME_TAG);
641
                    } catch (ClassNotFoundException e) {
642
                        LOG.warn("No se ha encontrado la clase '" + value + "'.", e);
643
                        throw new CantLocateClassException(parser, FIELD_NAME_TAG);
644
                    }
645
                }
709 646

  
710
	private class PairValueLabel {
711
		String label = null;
712
		String value = null;
713
	}
647
            } else if ( name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG) ) {
648
                // Do nothing
714 649

  
715
	private PairValueLabel importValueItem(XmlPullParser parser, String attributeName)
716
			throws XmlPullParserException, IOException {
717
		PairValueLabel pair = new PairValueLabel();
650
            } else {
651
                throw new UnexpectedTagOrAttributeException(parser, name);
652
            }
653
        }
718 654

  
719
		if (parser.getName().equalsIgnoreCase(VALUEITEM_TAG)) {
720
			parser.require(XmlPullParser.START_TAG, null, VALUEITEM_TAG);
721
			for (int i = 0; i < parser.getAttributeCount(); i++) {
722
				String name = parser.getAttributeName(i);
723
				if (name.equalsIgnoreCase(attributeName)) {
724
					pair.label = this.getAttributeValue(parser, i);
725
				} else if (name.equalsIgnoreCase(VALUEITEM_VALUE_TAG)) {
726
					pair.value = this.getAttributeValue(parser, i);
727
				} else {
728
					throw new UnexpectedTagOrAttributeException(parser, name);
729
				}
730
			}
731
			parser.nextTag();
655
        try {
656
            //
657
            // Coerce the min/max/default/available values to the type of
658
            // the field
659
            //
660
            if ( availableValues != null && !availableValues.isEmpty() ) {
661
                for ( int i = 0; i < availableValues.size(); i++ ) {
662
                    PairValueLabel pair = (PairValueLabel) availableValues
663
                            .get(i);
664
                    if ( pair.label == null ) {
665
                        if ( pair.value == null ) {
666
                            pair.label = "null";
667
                        } else {
668
                            pair.label = pair.value.toString();
669
                        }
670
                    }
671
                    availableValues.set(i,
672
                            new DynObjectValueItem(field.coerce(pair.value),
673
                                    pair.label));
674
                }
675
                field.setAvailableValues(availableValues);
676
            }
677
            if ( tagsValues != null && !tagsValues.isEmpty() ) {
678
                for ( int i = 0; i < tagsValues.size(); i++ ) {
679
                    PairValueLabel pair = (PairValueLabel) tagsValues.get(i);
680
                    if ( pair.label != null ) {
681
                        field.getTags().set(pair.label, pair.value);
682
                    }
683
                }
684
            }
685
            field.setMaxValue(field.coerce(values.get(FIELD_MAXVALUE_TAG)));
686
            field.setMinValue(field.coerce(values.get(FIELD_MINVALUE_TAG)));
687
            field.setDefaultFieldValue(field.coerce(values
688
                    .get(FIELD_DEFAULTVALUE_TAG)));
689
        } catch (CoercionException e) {
690
            throw new ParseCoerceException(e, parser);
691
        }
692
    }
732 693

  
733
			while (!(parser.getEventType() == XmlPullParser.END_TAG && parser
734
					.getName().equals(VALUEITEM_TAG))) {
735
				checkEndDocument(parser);
736
				parser.require(XmlPullParser.START_TAG, null, null);
737
				String name = parser.getName();
738
				if (name.equalsIgnoreCase(attributeName)) {
739
					pair.label = this.nextText(parser);
740
				} else if (name.equalsIgnoreCase(VALUEITEM_VALUE_TAG)) {
741
					pair.value = this.nextText(parser);
742
				} else {
743
					break;
744
				}
745
				parser.require(XmlPullParser.END_TAG, null, name);
746
				parser.nextTag();
747
			}
748
			parser.require(XmlPullParser.END_TAG, null, VALUEITEM_TAG);
749
		} else {
750
			parser.require(XmlPullParser.START_TAG, null, VALUEITEM_VALUE_TAG);
751
			for (int i = 0; i < parser.getAttributeCount(); i++) {
752
				String name = parser.getAttributeName(i);
753
				if (name.equalsIgnoreCase(attributeName)) {
754
					pair.label = parser.getAttributeValue(i);
755
				} else if (name.equalsIgnoreCase(VALUEITEM_VALUE_TAG)) {
756
					pair.value = this.getAttributeValue(parser, i);
757
				} else {
758
					throw new UnexpectedTagOrAttributeException(parser, name);
759
				}
760
			}
761
			if(pair.value == null){
762
				pair.value = parser.nextText();
763
			}else{
764
				pair.value += parser.nextText();
765
			}
766
			parser.require(XmlPullParser.END_TAG, null, VALUEITEM_VALUE_TAG);
767
		}
768
		return pair;
769
	}
694
    private class PairValueLabel {
770 695

  
771
	private void checkEndDocument(XmlPullParser parser)
772
			throws XmlPullParserException {
773
		if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
774
			throw new UnexpectedTagOrAttributeException(parser,
775
					"(end-of-document)");
776
		}
696
        String label = null;
697
        String value = null;
698
    }
777 699

  
778
	}
700
    private PairValueLabel importValueItem(XmlPullParser parser, String attributeName)
701
            throws XmlPullParserException, IOException {
702
        PairValueLabel pair = new PairValueLabel();
779 703

  
780
	public static abstract class ImportDynClassesException extends
781
			BaseRuntimeException {
704
        if ( parser.getName().equalsIgnoreCase(VALUEITEM_TAG) ) {
705
            parser.require(XmlPullParser.START_TAG, null, VALUEITEM_TAG);
706
            for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
707
                String name = parser.getAttributeName(i);
708
                if ( name.equalsIgnoreCase(attributeName) ) {
709
                    pair.label = this.getAttributeValue(parser, i);
710
                } else if ( name.equalsIgnoreCase(VALUEITEM_VALUE_TAG) ) {
711
                    pair.value = this.getAttributeValue(parser, i);
712
                } else {
713
                    throw new UnexpectedTagOrAttributeException(parser, name);
714
                }
715
            }
716
            parser.nextTag();
782 717

  
783
		/**
784
		 * 
785
		 */
786
		private static final long serialVersionUID = 3346283395112730192L;
718
            while ( !(parser.getEventType() == XmlPullParser.END_TAG && parser
719
                    .getName().equals(VALUEITEM_TAG)) ) {
720
                checkEndDocument(parser);
721
                parser.require(XmlPullParser.START_TAG, null, null);
722
                String name = parser.getName();
723
                if ( name.equalsIgnoreCase(attributeName) ) {
724
                    pair.label = this.nextText(parser);
725
                } else if ( name.equalsIgnoreCase(VALUEITEM_VALUE_TAG) ) {
726
                    pair.value = this.nextText(parser);
727
                } else {
728
                    break;
729
                }
730
                parser.require(XmlPullParser.END_TAG, null, name);
731
                parser.nextTag();
732
            }
733
            parser.require(XmlPullParser.END_TAG, null, VALUEITEM_TAG);
734
        } else {
735
            parser.require(XmlPullParser.START_TAG, null, VALUEITEM_VALUE_TAG);
736
            for ( int i = 0; i < parser.getAttributeCount(); i++ ) {
737
                String name = parser.getAttributeName(i);
738
                if ( name.equalsIgnoreCase(attributeName) ) {
739
                    pair.label = parser.getAttributeValue(i);
740
                } else if ( name.equalsIgnoreCase(VALUEITEM_VALUE_TAG) ) {
741
                    pair.value = this.getAttributeValue(parser, i);
742
                } else {
743
                    throw new UnexpectedTagOrAttributeException(parser, name);
744
                }
745
            }
746
            if ( pair.value == null ) {
747
                pair.value = parser.nextText();
748
            } else {
749
                pair.value += parser.nextText();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff