import org.dom4j.io.*;
import org.dom4j.*;

import java.util.*;
import java.io.*;

public class DomFilter
{
	public Document in_doc;
	public Document out_doc;
	public Element  in_root;
	public Element  out_root;
	
	public String	output_file;
	public Properties filter_data;
	

	private DocumentFactory factory = DocumentFactory.getInstance();
  	
	
	public DomFilter( String input_file, String filter_file, String output_file )
	{
		try
		{
			SAXReader saxReader = new SAXReader();
			in_doc = saxReader.read( new FileInputStream(input_file ) );
			
			String root_name = in_doc.getRootElement().getQualifiedName();

			out_doc = DocumentFactory.getInstance().createDocument();
			out_doc.addElement( root_name );
			out_root = out_doc.getRootElement();
			
			filter_data = new Properties();
			filter_data.load(new FileInputStream(filter_file));
			
			Enumeration filter_keys = filter_data.propertyNames();
			while (filter_keys.hasMoreElements())
			{
				String filter_key = (String)filter_keys.nextElement();
				String filter_value = (String)filter_data.get(filter_key); /// ADDED BY JASON
				filter( filter_value );                                    /// ALTERED BY JASON
			}
			
			FileOutputStream out = new FileOutputStream(output_file );
			
			OutputFormat outformat = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(out, outformat);
			writer.write(out_doc);
			writer.flush();
			
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		this.output_file = output_file;		
	}
	
	public void filter( String filter_key )
	{
	   logMessage("Filter Key: " + filter_key);   /// ADDED BY JASON
    	List nodes = in_doc.selectNodes( filter_key );

		for (int i=0; i<nodes.size(); i++)
		{
			Node node = (Node)nodes.get(i);
			
			if (node.getNodeType()==Node.ELEMENT_NODE)
			{
				Element el = (Element)node;
				
				Element el_copy = el.createCopy();
				
				add_to_result( el_copy, el.getPath() );
			}
		}
	}
	
	public void add_to_result( Element el, String path )
	{
		path = path.substring(0,path.lastIndexOf("/"));
		StringTokenizer st = new StringTokenizer( path,"/" );

		Element parent_el=out_root;
		String expr = "/"+st.nextToken();
		while (st.hasMoreTokens())
		{
			String el_name = st.nextToken();
			expr += "/" + el_name;
			List nodes = parent_el.selectNodes( expr );

			if (nodes.size()!=0)
			{
				parent_el = (Element)nodes.get(0);
			}
			else
			{
				parent_el = parent_el.addElement( el_name );
			}
		}
		parent_el.add( el );
	}
	
	
	public static void logMessage(String msg)
	{
		System.out.println( msg );
	}
	
	public static void usage()
	{
		System.out.println("DomFilter <input_file> <filter_file> <output_file>");
	}
	
	public static void main( String[] args )
	{
		if (args.length<3)
		{
			usage();
			return;
		}
		
		new DomFilter( args[0], args[1], args[2] );
	}
}