source: trunk/docx4j/src/main/java/org/docx4j/utils/CompoundTraversalUtilVisitorCallback.java @ 1803

Revision 1803, 2.0 KB checked in by jharrop, 4 weeks ago (diff)

Arnaud Kleinpeter's patch allowing the CompoundTraversalUtilVisitorCallback? to handle inheritance, just as in the Single one.

Line 
1package org.docx4j.utils;
2
3import java.util.HashMap;
4import java.util.List;
5import java.util.LinkedList;
6import java.util.Map;
7import java.util.Map.Entry;
8
9/**
10 * Use this if there is more than one object type (eg Tables and Paragraphs)
11 * you are interested in doing something with during the traversal.
12 *
13 * @author alberto
14 */
15public class CompoundTraversalUtilVisitorCallback extends
16                AbstractTraversalUtilVisitorCallback {
17
18        Map<Class, List<TraversalUtilVisitor>> visitorMap = null;
19
20        public CompoundTraversalUtilVisitorCallback(
21                        List<TraversalUtilVisitor> visitorList) {
22
23                visitorMap = setupTraversalVistorMap(visitorList);
24        }
25
26        protected Map<Class, List<TraversalUtilVisitor>> setupTraversalVistorMap(
27                        List<TraversalUtilVisitor> visitorList) {
28
29                Map<Class, List<TraversalUtilVisitor>> ret = new HashMap<Class, List<TraversalUtilVisitor>>();
30                Class visitorClass = null;
31                List<TraversalUtilVisitor> classVisitorList = null;
32                for (TraversalUtilVisitor visitor : visitorList) {
33                        visitorClass = findClassParameter(visitor.getClass());
34                        if (visitorClass == null) {
35                                throw new IllegalArgumentException(
36                                                "Can't identify the parameter class of the visitor "
37                                                                + visitor.getClass().getName());
38                        }
39                        classVisitorList = ret.get(visitorClass);
40                        if (classVisitorList == null) {
41                                classVisitorList = new LinkedList<TraversalUtilVisitor>();
42                                ret.put(visitorClass, classVisitorList);
43                        }
44                        classVisitorList.add(visitor);
45                }
46                return ret;
47        }
48
49        @Override
50        protected List<Object> apply(Object child, Object parent, List siblings) {
51                for (final Entry<Class, List<TraversalUtilVisitor>> entrySet : visitorMap.entrySet()) {
52                        final Class currentClass = entrySet.getKey();
53                        if (currentClass.isAssignableFrom(child.getClass())) {
54                                List<TraversalUtilVisitor> classVisitorList = entrySet.getValue();
55                                if (null != classVisitorList) {
56                                        for (TraversalUtilVisitor visitor : classVisitorList) {
57                                                visitor.apply(child, parent, siblings);
58                                        }
59                                }
60                        }
61                }
62                return null;
63        }
64
65}
Note: See TracBrowser for help on using the repository browser.