content: package com.alexgilleran.icesoap.misc.test;
  
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  
  import org.hamcrest.internal.ArrayIterator;
  import org.jaxen.saxpath.SAXPathException;
  import org.jaxen.saxpath.XPathHandler;
  import org.jaxen.saxpath.XPathReader;
  import org.jaxen.saxpath.helpers.XPathReaderFactory;
  import org.junit.Ignore;
  import org.junit.Test;
  
  /**
   * This test doesn't actually test anything - it's mainly useful for seeing what
   * Jaxen will do with any given XPath.
   * 
   * Put your XPath into XPATH_TO_PARSE and then a list of the invoked methods
   * with their values will appear in the console.
   * 
   * @author Alex Gilleran
   * 
   */
  public class JaxenTest {
  	private static final String XPATH_TO_PARSE = "example1/example2";
  
  	@Test
  	@Ignore("Comment this line when it's actually necessary to run this test")
  	public void test() throws SAXPathException {
  		XPathReader reader = XPathReaderFactory.createReader();
  		MethodTracker methodTracker = new MethodTracker();
  
  		XPathHandler handler = (XPathHandler) Proxy.newProxyInstance(
  				XPathHandler.class.getClassLoader(),
  				new Class<?>[] { XPathHandler.class }, methodTracker);
  		reader.setXPathHandler(handler);
  
  		reader.parse(XPATH_TO_PARSE);
  
  		System.out.print(methodTracker.getLog());
  	}
  
  	private class MethodTracker implements InvocationHandler {
  		private StringBuilder log = new StringBuilder("=====\n");
  
  		private void log(String methodName, Object... arguments) {
  			log.append(methodName).append("(");
  
  			if (arguments != null) {
  				ArrayIterator iterator = new ArrayIterator(arguments);
  
  				while (iterator.hasNext()) {
  					log.append(iterator.next());
  
  					if (iterator.hasNext()) {
  						log.append(", ");
  					}
  				}
  			}
  
  			log.append(")\n");
  		}
  
  		public String getLog() {
  			return log.toString();
  		}
  
  		@Override
  		public Object invoke(Object arg0, Method arg1, Object[] arg2)
  				throws Throwable {
  			log(arg1.getName(), arg2);
  
  			return null;
  		}
  	}
  }
  