package org.docx4j.utils; import java.util.HashMap; import java.util.List; import java.util.LinkedList; import java.util.Map; import java.util.Map.Entry; /** * Use this if there is more than one object type (eg Tables and Paragraphs) * you are interested in doing something with during the traversal. * * @author alberto */ public class CompoundTraversalUtilVisitorCallback extends AbstractTraversalUtilVisitorCallback { Map<Class, List<TraversalUtilVisitor>> visitorMap = null; public CompoundTraversalUtilVisitorCallback( List<TraversalUtilVisitor> visitorList) { visitorMap = setupTraversalVistorMap(visitorList); } protected Map<Class, List<TraversalUtilVisitor>> setupTraversalVistorMap( List<TraversalUtilVisitor> visitorList) { Map<Class, List<TraversalUtilVisitor>> ret = new HashMap<Class, List<TraversalUtilVisitor>>(); Class visitorClass = null; List<TraversalUtilVisitor> classVisitorList = null; for (TraversalUtilVisitor visitor : visitorList) { visitorClass = findClassParameter(visitor.getClass()); if (visitorClass == null) { throw new IllegalArgumentException( "Can't identify the parameter class of the visitor " + visitor.getClass().getName()); } classVisitorList = ret.get(visitorClass); if (classVisitorList == null) { classVisitorList = new LinkedList<TraversalUtilVisitor>(); ret.put(visitorClass, classVisitorList); } classVisitorList.add(visitor); } return ret; } @Override protected List<Object> apply(Object child, Object parent, List siblings) { for (final Entry<Class, List<TraversalUtilVisitor>> entrySet : visitorMap.entrySet()) { final Class currentClass = entrySet.getKey(); if (currentClass.isAssignableFrom(child.getClass())) { List<TraversalUtilVisitor> classVisitorList = entrySet.getValue(); if (null != classVisitorList) { for (TraversalUtilVisitor visitor : classVisitorList) { visitor.apply(child, parent, siblings); } } } } return null; } }