Revision 44455 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/extension/develtools/PersistenceDevelTool.java

View differences:

PersistenceDevelTool.java
23 23
 */
24 24
package org.gvsig.app.extension.develtools;
25 25

  
26
import java.lang.reflect.Method;
26 27
import java.util.ArrayList;
27 28
import java.util.Collections;
28 29
import java.util.Comparator;
29 30
import java.util.List;
30 31
import java.util.Set;
31 32
import java.util.TreeSet;
33
import java.util.logging.Level;
32 34

  
33 35
import org.gvsig.tools.ToolsLocator;
34 36
import org.gvsig.tools.dataTypes.DataTypesManager;
......
37 39
import org.gvsig.tools.persistence.PersistenceFactory;
38 40
import org.gvsig.tools.persistence.PersistenceManager;
39 41
import org.gvsig.tools.persistence.Persistent;
42
import org.gvsig.tools.persistence.PersistentState;
40 43
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
41 44
import org.slf4j.Logger;
42 45
import org.slf4j.LoggerFactory;
43 46

  
44 47
public class PersistenceDevelTool {
45
	private static Logger logger = LoggerFactory.getLogger(PersistenceDevelTool.class);
46 48

  
47
	public void showPersistenceFactories() {
48
		String html = this.getPersistenceFactories();
49
		InfoPanel.save2file("persistenceinfo", html);
50
		InfoPanel.showPanel("Persistence factories", WindowManager.MODE.WINDOW, html);
51
	}
52
	
49
    private static Logger logger = LoggerFactory.getLogger(PersistenceDevelTool.class);
53 50

  
54
	public class PersistenceInfo implements Comparable<PersistenceInfo> {
55
		PersistenceFactory factory;
56
		@SuppressWarnings("rawtypes")
57
		Class theClass;
58
		DynStruct definition;
51
    public void showPersistenceFactories() {
52
        String html = this.getPersistenceFactories();
53
        InfoPanel.save2file("persistenceinfo", html);
54
        InfoPanel.showPanel("Persistence factories", WindowManager.MODE.WINDOW, html);
55
    }
59 56

  
60
		PersistenceInfo(PersistenceFactory factory,
61
				@SuppressWarnings("rawtypes") Class theClass,
62
				DynStruct definition) {
63
			this.factory = factory;
64
			this.theClass = theClass;
65
			this.definition = definition;
66
		}
57
    public class PersistenceInfo implements Comparable<PersistenceInfo> {
67 58

  
68
		String getDefinitionName() {
69
			if (definition == null) {
70
				return "";
71
			}
72
			return definition.getFullName();
73
		}
59
        PersistenceFactory factory;
60
        @SuppressWarnings("rawtypes")
61
        Class theClass;
62
        DynStruct definition;
74 63

  
75
		String getDefinitionDescription() {
76
			if (definition == null) {
77
				return "";
78
			}
79
			return definition.getDescription();
80
		}
64
        PersistenceInfo(PersistenceFactory factory,
65
                @SuppressWarnings("rawtypes") Class theClass,
66
                DynStruct definition) {
67
            this.factory = factory;
68
            this.theClass = theClass;
69
            this.definition = definition;
70
        }
81 71

  
82
		String getClassName() {
83
			if (theClass == null) {
84
				return "";
85
			}
86
			return theClass.getName();
87
		}
72
        boolean hasSaveToState() {
73
            try {
74
                Method method = theClass.getMethod("saveToState", PersistentState.class);
75
                if (method == null) {
76
                    return false;
77
                }
78
            } catch (NoSuchMethodException | SecurityException ex) {
79
                return false;
80
            }
81
            return true;
82
        }
88 83

  
89
		String getFactoryName() {
90
			if (factory == null) {
91
				return "";
92
			}
93
			return factory.getClass().getName();
94
		}
84
        boolean hasLoadFromState() {
85
            try {
86
                Method method = theClass.getMethod("loadFromState", PersistentState.class);
87
                if (method == null) {
88
                    return false;
89
                }
90
            } catch (NoSuchMethodException | SecurityException ex) {
91
                return false;
92
            }
93
            return true;
94
        }
95 95

  
96
		public int compareTo(PersistenceInfo other) {
97
			int r = this.factory.getClass().getName()
98
					.compareTo(other.factory.getClass().getName());
99
			if (r == 0) {
100
				return this.theClass.getName().compareTo(
101
						other.theClass.getName());
102
			}
103
			return r;
104
		}
105
	}
96
        String getDefinitionName() {
97
            if (definition == null) {
98
                return "";
99
            }
100
            return definition.getFullName();
101
        }
106 102

  
107
	@SuppressWarnings("rawtypes")
108
	public class ClassComparator implements Comparator {
103
        String getDefinitionDescription() {
104
            if (definition == null) {
105
                return "";
106
            }
107
            return definition.getDescription();
108
        }
109 109

  
110
		public int compare(Object o1, Object o2) {
111
			if (o1 == null || o2 == null || ((Class) o1).getName() == null) {
112
				logger.warn("Esto no deberia estar pasando.");
113
				return 0; // FIXME
114
			}
115
			return ((Class) o1).getName().compareTo(((Class) o2).getName());
116
		}
110
        String getClassName() {
111
            if (theClass == null) {
112
                return "";
113
            }
114
            return theClass.getName();
115
        }
117 116

  
118
	}
117
        String getFactoryName() {
118
            if (factory == null) {
119
                return "";
120
            }
121
            return factory.getClass().getName();
122
        }
119 123

  
120
	@SuppressWarnings({ "unchecked", "rawtypes" })
121
	public String getPersistenceFactories() {
122
		int warningsCounter = 0;
123
		List<PersistenceInfo> classes = new ArrayList<PersistenceInfo>();
124
		Set<Class> referencedClasses = new TreeSet<Class>(new ClassComparator());
124
        public int compareTo(PersistenceInfo other) {
125
            int r = this.factory.getClass().getName()
126
                    .compareTo(other.factory.getClass().getName());
127
            if (r == 0) {
128
                return this.theClass.getName().compareTo(
129
                        other.theClass.getName());
130
            }
131
            return r;
132
        }
133
    }
125 134

  
126
		PersistenceManager manager = ToolsLocator.getPersistenceManager();
135
    @SuppressWarnings("rawtypes")
136
    public class ClassComparator implements Comparator {
127 137

  
128
		List<PersistenceFactory> factories = manager.getFactories();
129
		for (PersistenceFactory factory : factories) {
130
			List<Class> theClasses = factory.getManagedClasses();
131
			for (Class theClass : theClasses) {
138
        public int compare(Object o1, Object o2) {
139
            if (o1 == null || o2 == null || ((Class) o1).getName() == null) {
140
                logger.warn("Esto no deberia estar pasando.");
141
                return 0; // FIXME
142
            }
143
            return ((Class) o1).getName().compareTo(((Class) o2).getName());
144
        }
132 145

  
133
				DynStruct definition = manager.getDefinition(theClass);
134
				List defs = factory.getDefinitions();
135
				if (definition == null && defs != null && !defs.isEmpty()) {
136
					for (int i = 0; i < defs.size(); i++) {
137
						definition = (DynStruct) defs.get(i);
138
						classes.add(new PersistenceInfo(factory, theClass,
139
								definition));
140
					}
141
				} else {
142
					classes.add(new PersistenceInfo(factory, theClass,
143
							definition));
144
				}
145
			}
146
		}
147
		Collections.sort(classes);
146
    }
148 147

  
149
		StringBuffer buffer = new StringBuffer();
150
		StringBuffer warnings = new StringBuffer();
148
    @SuppressWarnings({"unchecked", "rawtypes"})
149
    public String getPersistenceFactories() {
150
        int warningsCounter = 0;
151
        List<PersistenceInfo> classes = new ArrayList<PersistenceInfo>();
152
        Set<Class> referencedClasses = new TreeSet<Class>(new ClassComparator());
151 153

  
152
		buffer.append("<html>\n");
153
		buffer.append("<body>\n");
154
		buffer.append("<h2>Supported persistent classes</h2>\n");
155
		buffer.append("<br>\n");
154
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
156 155

  
157
		buffer.append("<ol>\n");
158
		for (PersistenceInfo classInfo : classes) {
159
			StringBuffer classBuffer = new StringBuffer();
160
			boolean warning = false;
161
			classBuffer.append("  <li>\n    ");
162
			classBuffer.append("Class: <i>");
163
			classBuffer.append(classInfo.getClassName());
164
			classBuffer.append("</i><br>\n    Persistent: <i>");
165
			if (Persistent.class.isAssignableFrom(classInfo.theClass)) {
166
				classBuffer.append(" yes.");
167
			} else {
168
				classBuffer.append(" through a factory.");
169
			}
170
			classBuffer.append("<br>\n    Factory: <i>");
171
			classBuffer.append(classInfo.getFactoryName()).append(
172
					"</i><br>\n    Definition name: <i>");
173
			classBuffer.append(classInfo.getDefinitionName()).append(
174
					"</i><br>\n    Description: \n");
175
			classBuffer.append(classInfo.getDefinitionDescription()).append(
176
					"<br>\n    ");
177
			DataTypesManager dataTypesManager = ToolsLocator
178
					.getDataTypesManager();
179
			DynStruct definition = classInfo.definition;
180
			if (definition == null) {
181
				classBuffer.append("Definition for ")
182
						.append(classInfo.getClassName())
183
						.append(" is null.<br>\n    ");
184
				warningsCounter++;
185
				warning = true;
186
			} else {
187
				DynField[] fields = definition.getDynFields();
188
				for (int i = 0; i < fields.length; i++) {
189
					DynField field = fields[i];
190
					if (dataTypesManager.isContainer(field.getType())) {
191
						if (field.getClassOfItems() == null) {
192
							classBuffer
193
									.append("Field <b>")
194
									.append(field.getName())
195
									.append("</b> as container (")
196
                                                                        .append(field.getDataType().getName())
197
                                                                        .append("),  can't has class for value of items.<br>\n    ");
198
							warningsCounter++;
199
							warning = true;
200
						} else {
201
							classBuffer.append("Field ")
202
									.append(field.getName())
203
									.append(" as container (")
204
                                                                        .append(field.getDataType().getName())
205
                                                                        .append(") of '")
206
									.append(field.getClassOfItems().getName())
207
									.append("'.<br>\n    ");
208
							referencedClasses.add(field.getClassOfItems());
209
						}
210
					} else if (dataTypesManager.isObject(field.getType())) {
211
						if (field.getClassOfValue() == null) {
212
							classBuffer
213
									.append("Field <b>")
214
									.append(field.getName())
215
									.append(" as object </b> can't has class of value.<br>\n    ");
216
							warningsCounter++;
217
							warning = true;
218
						} else {
219
							classBuffer.append("Field ")
220
									.append(field.getName()).append(" as object '")
221
									.append(field.getClassOfValue())
222
									.append("'.<br>\n    ");
223
							referencedClasses.add(field.getClassOfValue());
224
						}
225
					} else {
226
                                                classBuffer.append("Field ")
227
                                                    .append(field.getName()).append(" as '")
228
                                                    .append(field.getDataType().getName())
229
                                                    .append("'.<br>\n    ");
230
                                        }
231
				}
232
			}
233
			classBuffer.append("<br>\n  </li>\n");
234
			buffer.append(classBuffer);
235
			if (warning) {
236
				warnings.append(classBuffer);
237
			}
238
		}
239
		buffer.append("</ol>\n");
240
		buffer.append("<br>\n");
241
		buffer.append("<br>\n");
156
        List<PersistenceFactory> factories = manager.getFactories();
157
        for (PersistenceFactory factory : factories) {
158
            List<Class> theClasses = factory.getManagedClasses();
159
            for (Class theClass : theClasses) {
242 160

  
243
		buffer.append("<h2>Persistent classes with problems</h2>\n");
244
		buffer.append("<ol>\n");
245
		buffer.append(warnings);
246
		buffer.append("</ol>\n");
247
		buffer.append("<br>\n<p>Total warnigs: ").append(warningsCounter)
248
				.append("</p>");
161
                DynStruct definition = manager.getDefinition(theClass);
162
                List defs = factory.getDefinitions();
163
                if (definition == null && defs != null && !defs.isEmpty()) {
164
                    for (int i = 0; i < defs.size(); i++) {
165
                        definition = (DynStruct) defs.get(i);
166
                        classes.add(new PersistenceInfo(factory, theClass,
167
                                definition));
168
                    }
169
                } else {
170
                    classes.add(new PersistenceInfo(factory, theClass,
171
                            definition));
172
                }
173
            }
174
        }
175
        Collections.sort(classes);
249 176

  
250
		buffer.append("<h2>Not persistents used classes</h2>\n");
251
		buffer.append("<ol>\n");
252
		for (Class theClass : referencedClasses) {
253
			// if( manager.canPersist(theClass) ) {
254
			// continue;
255
			// }
256
			if (Persistent.class.isAssignableFrom(theClass)) {
257
				continue;
258
			}
259
			if (manager.getFactories().get(theClass) != null) {
260
				continue;
261
			}
262
			buffer.append("  <li>\n");
263
			buffer.append("    <i>").append(theClass.getName())
264
					.append("</i><br>\n");
265
			buffer.append("  </li>\n");
266
			warningsCounter++;
267
		}
268
		buffer.append("</ol>\n");
177
        StringBuffer buffer = new StringBuffer();
178
        StringBuffer warnings = new StringBuffer();
269 179

  
270
		buffer.append("</body>\n");
271
		buffer.append("</html>\n");
180
        buffer.append("<html>\n");
181
        buffer.append("<body>\n");
182
        buffer.append("<h2>Supported persistent classes</h2>\n");
183
        buffer.append("<br>\n");
272 184

  
273
		return buffer.toString();
274
	}
185
        buffer.append("<ol>\n");
186
        for (PersistenceInfo classInfo : classes) {
187
            StringBuffer classBuffer = new StringBuffer();
188
            boolean warning = false;
189
            classBuffer.append("  <li>\n    ");
190
            classBuffer.append("Class: <i>");
191
            classBuffer.append(classInfo.getClassName());
192
            classBuffer.append("</i><br>\n    Persistent: <i>");
275 193

  
194
            if (Persistent.class.isAssignableFrom(classInfo.theClass)) {
195
                classBuffer.append(" yes.");
196
                if (!classInfo.hasSaveToState()) {
197
                    classBuffer.append("<br>\n    <b>This class doesn't implement saveToState</b>");
198
                    warningsCounter++;
199
                    warning = true;
200
                }
201
                if (!classInfo.hasLoadFromState()) {
202
                    classBuffer.append("<br>\n    <b>This class doesn't implement loadFromState</b>");
203
                    warningsCounter++;
204
                    warning = true;
205
                }
206
            } else {
207
                classBuffer.append(" through a factory.");
208
            }
276 209

  
210
            classBuffer.append("<br>\n    Factory: <i>");
211
            classBuffer.append(classInfo.getFactoryName()).append(
212
                    "</i><br>\n    Definition name: <i>");
213
            classBuffer.append(classInfo.getDefinitionName()).append(
214
                    "</i><br>\n    Description: \n");
215
            classBuffer.append(classInfo.getDefinitionDescription()).append(
216
                    "<br>\n    ");
217
            DataTypesManager dataTypesManager = ToolsLocator
218
                    .getDataTypesManager();
219
            DynStruct definition = classInfo.definition;
220
            if (definition == null) {
221
                classBuffer.append("Definition for ")
222
                        .append(classInfo.getClassName())
223
                        .append(" is null.<br>\n    ");
224
                warningsCounter++;
225
                warning = true;
226
            } else {
227
                DynField[] fields = definition.getDynFields();
228
                for (int i = 0; i < fields.length; i++) {
229
                    DynField field = fields[i];
230
                    if (dataTypesManager.isContainer(field.getType())) {
231
                        if (field.getClassOfItems() == null) {
232
                            classBuffer
233
                                    .append("Field <b>")
234
                                    .append(field.getName())
235
                                    .append("</b> as container (")
236
                                    .append(field.getDataType().getName())
237
                                    .append("),  can't has class for value of items.<br>\n    ");
238
                            warningsCounter++;
239
                            warning = true;
240
                        } else {
241
                            classBuffer.append("Field ")
242
                                    .append(field.getName())
243
                                    .append(" as container (")
244
                                    .append(field.getDataType().getName())
245
                                    .append(") of '")
246
                                    .append(field.getClassOfItems().getName())
247
                                    .append("'.<br>\n    ");
248
                            referencedClasses.add(field.getClassOfItems());
249
                        }
250
                    } else if (dataTypesManager.isObject(field.getType())) {
251
                        if (field.getClassOfValue() == null) {
252
                            classBuffer
253
                                    .append("Field <b>")
254
                                    .append(field.getName())
255
                                    .append(" as object </b> can't has class of value.<br>\n    ");
256
                            warningsCounter++;
257
                            warning = true;
258
                        } else {
259
                            classBuffer.append("Field ")
260
                                    .append(field.getName()).append(" as object '")
261
                                    .append(field.getClassOfValue())
262
                                    .append("'.<br>\n    ");
263
                            referencedClasses.add(field.getClassOfValue());
264
                        }
265
                    } else {
266
                        classBuffer.append("Field ")
267
                                .append(field.getName()).append(" as '")
268
                                .append(field.getDataType().getName())
269
                                .append("'.<br>\n    ");
270
                    }
271
                }
272
            }
273
            classBuffer.append("<br>\n  </li>\n");
274
            buffer.append(classBuffer);
275
            if (warning) {
276
                warnings.append(classBuffer);
277
            }
278
        }
279
        buffer.append("</ol>\n");
280
        buffer.append("<br>\n");
281
        buffer.append("<br>\n");
282

  
283
        buffer.append("<h2>Persistent classes with problems</h2>\n");
284
        buffer.append("<ol>\n");
285
        buffer.append(warnings);
286
        buffer.append("</ol>\n");
287
        buffer.append("<br>\n<p>Total warnigs: ").append(warningsCounter)
288
                .append("</p>");
289

  
290
        buffer.append("<h2>Not persistents used classes</h2>\n");
291
        buffer.append("<ol>\n");
292
        for (Class theClass : referencedClasses) {
293
            // if( manager.canPersist(theClass) ) {
294
            // continue;
295
            // }
296
            if (Persistent.class.isAssignableFrom(theClass)) {
297
                continue;
298
            }
299
            if (manager.getFactories().get(theClass) != null) {
300
                continue;
301
            }
302
            buffer.append("  <li>\n");
303
            buffer.append("    <i>").append(theClass.getName())
304
                    .append("</i><br>\n");
305
            buffer.append("  </li>\n");
306
            warningsCounter++;
307
        }
308
        buffer.append("</ol>\n");
309

  
310
        buffer.append("</body>\n");
311
        buffer.append("</html>\n");
312

  
313
        return buffer.toString();
314
    }
315

  
277 316
}

Also available in: Unified diff