Project

General

Profile

« Previous | Next » 

Revision 86d726ac

Added by Andreas Müller almost 4 years ago

add includeIgnore parameter to EntityCacherDebugResult and minor refactoring

View differences:

cdmlib-cache/src/main/java/eu/etaxonomy/cdm/cache/EntityCacherDebugResult.java
50 50
    public EntityCacherDebugResult() {
51 51
    }
52 52

  
53
    public <T extends CdmBase> EntityCacherDebugResult(CdmTransientEntityCacher cacher, Collection<T> rootEntities) {
53
    public <T extends CdmBase> EntityCacherDebugResult(CdmTransientEntityCacher cacher, Collection<T> rootEntities, boolean includeIgnored) {
54 54
        this.cacher = cacher;
55 55
        init();
56 56

  
57 57
        if(rootEntities != null && !rootEntities.isEmpty()) {
58 58
            for(CdmBase rootEntity : rootEntities) {
59
                debug(rootEntity, true);
59
                debug(rootEntity, true, includeIgnored);
60 60
                String out = toString(duplicateCdmEntityMap, notInCacheList, rootEntity);
61 61
                System.out.println(out);
62 62
                debugOutput.append(out);
......
76 76
        notInCacheList.clear();
77 77
    }
78 78

  
79
    public void addDuplicateEntity(CdmEntityInfo cei, CdmEntityInfo cachedCei) {
79
    private void addDuplicateInGraphEntity(CdmEntityInfo cei, CdmEntityInfo cachedCei) {
80 80
        duplicateCdmEntityMap.put(cei, cachedCei);
81 81
    }
82 82

  
83
    public void addEntityNotInCache(CdmEntityInfo cei) {
83
    private void addEntityNotInCache(CdmEntityInfo cei) {
84 84
        notInCacheList.add(cei);
85 85
    }
86 86

  
......
104 104
            CdmBase rootEntity) {
105 105

  
106 106
        StringBuilder sb = new StringBuilder();
107
        toStringDuplicatesInGraph(duplicateCdmEntityMap, rootEntity, sb);
108

  
109
        sb.append(System.getProperty("line.separator"));
110

  
111
        toStringNotInCache(notInCacheList, sb);
112

  
113
        sb.append(System.getProperty("line.separator"));
114
        return sb.toString();
115
    }
116

  
117
    private void toStringNotInCache(List<CdmEntityInfo> notInCacheList, StringBuilder sb) {
118
        sb.append(System.getProperty("line.separator"));
119

  
120
        if(notInCacheList.isEmpty()) {
121
            sb.append("No entities found in root graph which are not in Cache.");
122
        } else {
123
            sb.append("Entities in root graph which are not in cache (");
124
            sb.append(NotInCacheType.NOT_FOUND.getLabel() + ": " + NotInCacheType.NOT_FOUND.name() + ", ");
125
            sb.append(NotInCacheType.COPY_ENTITY.getLabel() + ": " + NotInCacheType.COPY_ENTITY.name() + "):");
126

  
127
            for(CdmEntityInfo cei : notInCacheList) {
128
                CdmBase cb = (CdmBase) cei.getObject();
129
                CdmEntityInfo parentCei = cei.getParent();
130

  
131
                sb.append(System.getProperty("line.separator"));
132

  
133
                String fieldName = "";
134
                if(cei.getField() != null) {
135
                    fieldName = cei.getField().getName();
136
                }
137
                sb.append(" - ");
138
                if(cei.getNotInCacheDetail() != null){
139
                    sb.append(cei.getNotInCacheDetail().getLabel());
140
                }
141
                sb.append(fieldName + "[" + cb.getUserFriendlyTypeName() + "#" + cb.getId() + "]");
142

  
143
                String parentsPath = "";
144
                while(parentCei != null){
145
                    parentsPath += ".";
146
                    parentsPath += parentCei.getField() != null? parentCei.getField().getName() : "";
147
                    String id = "";
148
                    if(parentCei.getObject() instanceof CdmBase){
149
                        id = "#" + ((CdmBase)parentCei.getObject()).getId();
150
                    }
151
                    parentsPath += "[" + classLabel(parentCei.getObject()) + id + "]";
152
                    parentCei = parentCei.getParent();
153
                }
154

  
155
                sb.append(parentsPath);
156
            }
157
        }
158
    }
159

  
160
    private void toStringDuplicatesInGraph(Map<CdmEntityInfo, CdmEntityInfo> duplicateCdmEntityMap, CdmBase rootEntity,
161
            StringBuilder sb) {
107 162
        sb.append(System.getProperty("line.separator"));
108 163
        sb.append("<<< Root Entity " + rootEntity.getUserFriendlyTypeName() + " with id " + rootEntity.getId() + " >>>");
109 164
        sb.append(System.getProperty("line.separator"));
......
152 207
                sb.append("-----------");
153 208
            }
154 209
        }
155

  
156
        sb.append(System.getProperty("line.separator"));
157
        sb.append(System.getProperty("line.separator"));
158

  
159
        if(notInCacheList.isEmpty()) {
160
            sb.append("No Entities found which are not in Cache.");
161
        } else {
162
            sb.append("Not In Cache Entities (");
163
            sb.append(NotInCacheDetail.NOT_FOUND.getLabel() + ": " + NotInCacheDetail.NOT_FOUND.name() + ", ");
164
            sb.append(NotInCacheDetail.COPY_ENTITY.getLabel() + ": " + NotInCacheDetail.COPY_ENTITY.name() + ")");
165

  
166
            for(CdmEntityInfo cei : notInCacheList) {
167
                CdmBase cb = (CdmBase) cei.getObject();
168
                CdmEntityInfo parentCei = cei.getParent();
169
                Object parentEntity = null;
170
                if(parentCei != null){
171
                    parentEntity = parentCei.getObject();
172
                }
173

  
174
                sb.append(System.getProperty("line.separator"));
175

  
176
                String fieldName = "";
177
                if(cei.getField() != null) {
178
                    fieldName = cei.getField().getName();
179
                }
180
                sb.append(" - ");
181
                if(cei.getNotInCacheDetail() != null){
182
                    sb.append(cei.getNotInCacheDetail().getLabel());
183
                }
184
                sb.append(fieldName + "[" + cb.getUserFriendlyTypeName() + "#" + cb.getId() + "]");
185

  
186
                String parentsPath = "";
187
                while(parentCei != null){
188
                    parentsPath += ".";
189
                    parentsPath += parentCei.getField() != null? parentCei.getField().getName() : "";
190
                    String id = "";
191
                    if(parentCei.getObject() instanceof CdmBase){
192
                        id = "#" + ((CdmBase)parentCei.getObject()).getId();
193
                    }
194
                    parentsPath += "[" + classLabel(parentCei.getObject()) + id + "]";
195
                    parentCei = parentCei.getParent();
196
                }
197

  
198
                sb.append(parentsPath);
199
            }
200
        }
201
        sb.append(System.getProperty("line.separator"));
202
        return sb.toString();
203 210
    }
204 211

  
205 212
    private String classLabel(Object entity){
......
225 232
        return caches;
226 233
    }
227 234

  
228
    private void debug(CdmBase cdmEntity, boolean recursive) {
235
    private void debug(CdmBase cdmEntity, boolean recursive, boolean includeIgnored) {
229 236
        if(cdmEntity == null) {
230 237
            return;
231 238
        }
......
242 249

  
243 250
    private <T extends Object> void debugRecursive(T obj,
244 251
            List<CdmEntityInfo> alreadyVisitedEntities,
245
            CdmEntityInfo cei) {
252
            CdmEntityInfo cei, boolean includeIgnored) {
246 253
        if(obj == null) {
247 254
            return;
248 255
        }
249 256
        if(obj instanceof CdmBase) {
250
            debugRecursive((CdmBase)obj, alreadyVisitedEntities, cei);
257
            debugRecursive((CdmBase)obj, alreadyVisitedEntities, cei, includeIgnored);
251 258
        } else if (obj instanceof Map) {
252
            debug((Map<T,T>)obj, alreadyVisitedEntities, cei);
259
            debug((Map<T,T>)obj, alreadyVisitedEntities, cei, includeIgnored);
253 260
        } else if (obj instanceof Collection) {
254
            debug((Collection<T>)obj, alreadyVisitedEntities, cei);
261
            debug((Collection<T>)obj, alreadyVisitedEntities, cei, includeIgnored);
255 262
        }
256 263
        logger.info("No caching yet for type " + obj.getClass().getName());
257 264
    }
258 265

  
259 266
    private <T extends Object> void debug(Map<T,T> map,
260 267
            List<CdmEntityInfo> alreadyVisitedEntities,
261
            CdmEntityInfo cei) {
268
            CdmEntityInfo cei, boolean includeIgnored) {
262 269
        if(map == null || map.isEmpty()) {
263 270
            return;
264 271
        }
......
274 281
            CdmEntityInfo valueCei = new CdmEntityInfo(ProxyUtils.deproxyIfInitialized(e.getValue()));
275 282
            childCei.addChild(valueCei);
276 283

  
277
            debugRecursive(e.getKey(), alreadyVisitedEntities, keyCei);
278
            debugRecursive(e.getValue(), alreadyVisitedEntities, valueCei);
284
            debugRecursive(e.getKey(), alreadyVisitedEntities, keyCei, includeIgnored);
285
            debugRecursive(e.getValue(), alreadyVisitedEntities, valueCei, includeIgnored);
279 286
        }
280 287
    }
281 288

  
282 289
    private <T extends Object> void debug(Collection<T> collection,
283 290
            List<CdmEntityInfo> alreadyVisitedEntities,
284
            CdmEntityInfo cei) {
291
            CdmEntityInfo cei, boolean includeIgnored) {
285 292
        Iterator<T> collectionItr = collection.iterator();
286 293

  
287 294
        while(collectionItr.hasNext()) {
......
296 303
            if(!alreadyVisited){
297 304
                CdmEntityInfo childCei = new CdmEntityInfo(ProxyUtils.deproxyIfInitialized(obj));
298 305
                cei.addChild(childCei);
299
                debugRecursive(obj, alreadyVisitedEntities, childCei);
306
                debugRecursive(obj, alreadyVisitedEntities, childCei, includeIgnored);
300 307
            }
301 308
        }
302 309
    }
303 310

  
304 311
    private void debugRecursive(CdmBase cdmEntity,
305 312
            List<CdmEntityInfo> alreadyVisitedEntities,
306
            CdmEntityInfo cei) {
313
            CdmEntityInfo cei, boolean includeIgnored) {
307 314

  
308 315
        if(cei.getObject() instanceof CdmBase) {
309 316
           CdmBase cb =  (CdmBase)cei.getObject();
310 317
           cb = ProxyUtils.deproxyIfInitialized(cb);
311 318
           CdmBase cachedCdmEntityInSubGraph = cacher.getFromCache(cb);
312
           if(cachedCdmEntityInSubGraph != cb) {
313
               cei.setNotInCacheDetail(cachedCdmEntityInSubGraph == null ? NotInCacheDetail.NOT_FOUND : NotInCacheDetail.COPY_ENTITY);
319
           if(cachedCdmEntityInSubGraph != cb && (includeIgnored || !cacher.ignoreRecursiveLoad(cb))) {
320
               cei.setNotInCacheDetail(cachedCdmEntityInSubGraph == null ? NotInCacheType.NOT_FOUND : NotInCacheType.COPY_ENTITY);
314 321
               // found a cdm entity which is not in cache - need to record this
315 322
               //logger.info("  - found entity not in cache " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId());
316 323
               addEntityNotInCache(cei);
......
336 343

  
337 344
    }
338 345

  
346
    private void debugField(CdmBase cdmEntity, List<CdmEntityInfo> alreadyVisitedEntities, CdmEntityInfo cei,
347
            String field, boolean includeIgnored) {
348
        // retrieve the actual object corresponding to the field.
349
        // this object will be either a CdmBase or a Collection / Map
350
        // with CdmBase as the generic type
351
        CdmEntityInfo childCei = getDebugCdmBaseTypeFieldValue(cdmEntity, field, alreadyVisitedEntities, cei, includeIgnored);
352
        if(!childCei.isProxy()) {
353
            Object object = childCei.getObject();
354
            if(object != null && object instanceof CdmBase) {
355
                CdmBase cdmEntityInSubGraph = (CdmBase)object;
356
                if(!containsIdenticalCdmEntity(alreadyVisitedEntities, cdmEntityInSubGraph)) {
357
                    logger.info("recursive debugging object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId());
358
                    debugRecursive(cdmEntityInSubGraph, alreadyVisitedEntities, childCei, includeIgnored);
359
                } else {
360
                    logger.info("object of type " + cdmEntityInSubGraph.getClass().getName() + " with id " + cdmEntityInSubGraph.getId() + " already visited");
361
                }
362
            }
363
        }
364
    }
339 365

  
340 366
    private CdmEntityInfo getDebugCdmBaseTypeFieldValue(CdmBase cdmEntity,
341 367
            String fieldName,
342 368
            List<CdmEntityInfo> alreadyVisitedEntities,
343
            CdmEntityInfo cei) {
369
            CdmEntityInfo cei, boolean includeIgnored) {
344 370

  
345 371
        CdmEntityInfo childCei = null;
346 372
        Class<?> clazz = cdmEntity.getClass();
......
374 400

  
375 401
                        //logger.info("  - found duplicate entity at " + fieldName + "' in object of type " + clazz.getName() + " with id " + cdmEntity.getId());
376 402
                        CdmEntityInfo dupCei = getDuplicate(alreadyVisitedEntities, cdmEntityInSubGraph);
377
                        if(dupCei != null) {
378
                            addDuplicateEntity(childCei, dupCei);
403
                        if(dupCei != null && (includeIgnored || !cacher.ignoreRecursiveLoad(cdmEntityInSubGraph))) {
404
                            addDuplicateInGraphEntity(childCei, dupCei);
379 405
                        }
380 406

  
381 407
                    } else if(o instanceof Map) {
382
                        debugRecursive((Map)o, alreadyVisitedEntities, childCei);
408
                        debugRecursive((Map)o, alreadyVisitedEntities, childCei, includeIgnored);
383 409
                    } else if(o instanceof Collection) {
384
                        debugRecursive((Collection)o, alreadyVisitedEntities, childCei);
410
                        debugRecursive((Collection)o, alreadyVisitedEntities, childCei, includeIgnored);
385 411
                    }
386 412

  
387 413
                }

Also available in: Unified diff