1 // 2 // ======================================================================== 3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. 4 // ------------------------------------------------------------------------ 5 // All rights reserved. This program and the accompanying materials 6 // are made available under the terms of the Eclipse Public License v1.0 7 // and Apache License v2.0 which accompanies this distribution. 8 // 9 // The Eclipse Public License is available at 10 // http://www.eclipse.org/legal/epl-v10.html 11 // 12 // The Apache License v2.0 is available at 13 // http://www.opensource.org/licenses/apache2.0.php 14 // 15 // You may elect to redistribute this code under either of these licenses. 16 // ======================================================================== 17 // 18 19 package org.eclipse.jetty.webapp; 20 21 import java.lang.reflect.Method; 22 import java.util.HashMap; 23 import java.util.Iterator; 24 import java.util.Map; 25 26 import org.eclipse.jetty.xml.XmlParser; 27 28 /** 29 * IterativeDescriptorProcessor 30 * 31 * 32 */ 33 public abstract class IterativeDescriptorProcessor implements DescriptorProcessor 34 { 35 public static final Class<?>[] __signature = new Class[]{WebAppContext.class, Descriptor.class, XmlParser.Node.class}; 36 protected Map<String, Method> _visitors = new HashMap<String, Method>(); 37 public abstract void start(WebAppContext context, Descriptor descriptor); 38 public abstract void end(WebAppContext context, Descriptor descriptor); 39 40 /** 41 * Register a method to be called back when visiting the node with the given name. 42 * The method must exist on a subclass of this class, and must have the signature: 43 * public void method (Descriptor descriptor, XmlParser.Node node) 44 * @param nodeName 45 * @param m 46 */ 47 public void registerVisitor(String nodeName, Method m) 48 { 49 _visitors.put(nodeName, m); 50 } 51 52 53 /** 54 * {@inheritDoc} 55 */ 56 public void process(WebAppContext context, Descriptor descriptor) 57 throws Exception 58 { 59 if (descriptor == null) 60 return; 61 62 start(context,descriptor); 63 64 XmlParser.Node root = descriptor.getRoot(); 65 Iterator<?> iter = root.iterator(); 66 XmlParser.Node node = null; 67 while (iter.hasNext()) 68 { 69 Object o = iter.next(); 70 if (!(o instanceof XmlParser.Node)) continue; 71 node = (XmlParser.Node) o; 72 visit(context, descriptor, node); 73 } 74 75 end(context,descriptor); 76 } 77 78 79 protected void visit (WebAppContext context, Descriptor descriptor, XmlParser.Node node) 80 throws Exception 81 { 82 String name = node.getTag(); 83 Method m = _visitors.get(name); 84 if (m != null) 85 m.invoke(this, new Object[]{context, descriptor, node}); 86 } 87 } 88