// Path: easyxml-core/src/main/java/com/giffing/easyxml/context/ParseContext.java
// public class ParseContext {
// 	
// 	/**
// 	 * The current xml element path divided by slash
// 	 */
// 	private String path;
// 
// 	public String getPath() {
// 		return path;
// 	}
// 
// 	public void setPath(String path) {
// 		this.path = path;
// 	}
// 
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/context/TransformContext.java
// public class TransformContext<T, R> {
// 
// 	private XMLStreamReader streamReader;
// 
// 	private ItemReader<T, R> itemReader;
// 
// 	public TransformContext(XMLStreamReader streamReader, ItemReader<T, R> itemReader) {
// 		this.streamReader = streamReader;
// 		this.itemReader = itemReader;
// 	}
// 
// 	public XMLStreamReader getStreamReader() {
// 		return streamReader;
// 	}
// 
// 	public void setStreamReader(XMLStreamReader streamReader) {
// 		this.streamReader = streamReader;
// 	}
// 
// 	public ItemReader<T, R> getItemReader() {
// 		return itemReader;
// 	}
// 
// 	public void setItemReader(ItemReader<T, R> itemReader) {
// 		this.itemReader = itemReader;
// 	}
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/reader/item/ItemReader.java
// public interface ItemReader<T, R> {
// 
// 	/**
// 	 * @param t transform result
// 	 */
// 	R read(T t);
// 
// 	/**
// 	 * Indicates if the reader is responsible for the current context
// 	 * 
// 	 * @param context
// 	 */
// 	boolean shouldHandle(ParseContext context);
// 
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/stax/reader/context/StaxTransformerResult.java
// public class StaxTransformerResult implements TransformResult<XMLStreamReader> {
// 
// 	private XMLStreamReader reader;
// 
// 	public StaxTransformerResult(XMLStreamReader reader){
// 		this.reader = reader;
// 	}
// 	
// 	@Override
// 	public XMLStreamReader getContent() {
// 		return reader;
// 	}
// 
// }


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.commons.lang3.StringUtils;
import com.giffing.easyxml.context.ParseContext;
import com.giffing.easyxml.context.TransformContext;
import com.giffing.easyxml.reader.item.ItemReader;
import com.giffing.easyxml.stax.reader.context.StaxTransformerResult;
		this.readers = readers;
		this.staxItemReaders = staxItemReaders;
		this.context = context;
	}

	public void setParseContext(ParseContext context) {
		this.context = context;
	}

	public R readNext() {
		return currentItemReader.read(currentReader.transform(
			new TransformContext<T, R>(streamReader, currentItemReader))
			.getContent());
	}

	public boolean hasNext() {
		if (streamReader == null) {
			doOpen();
		}
		try {
			while (streamReader.hasNext()) {
				if (streamReader.isEndElement()) {
					removePath();
				}
				if (streamReader.isStartElement()) {
					addPath();
					context.setPath(StringUtils.join(currentElementPath, "/"));
					
					for (ItemReader<XMLStreamReader, Void> staxItemReader : staxItemReaders) {
						if(staxItemReader.shouldHandle(context)) {
// Path: easyxml-core/src/main/java/com/giffing/easyxml/context/ParseContext.java
// public class ParseContext {
// 	
// 	/**
// 	 * The current xml element path divided by slash
// 	 */
// 	private String path;
// 
// 	public String getPath() {
// 		return path;
// 	}
// 
// 	public void setPath(String path) {
// 		this.path = path;
// 	}
// 
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/context/TransformContext.java
// public class TransformContext<T, R> {
// 
// 	private XMLStreamReader streamReader;
// 
// 	private ItemReader<T, R> itemReader;
// 
// 	public TransformContext(XMLStreamReader streamReader, ItemReader<T, R> itemReader) {
// 		this.streamReader = streamReader;
// 		this.itemReader = itemReader;
// 	}
// 
// 	public XMLStreamReader getStreamReader() {
// 		return streamReader;
// 	}
// 
// 	public void setStreamReader(XMLStreamReader streamReader) {
// 		this.streamReader = streamReader;
// 	}
// 
// 	public ItemReader<T, R> getItemReader() {
// 		return itemReader;
// 	}
// 
// 	public void setItemReader(ItemReader<T, R> itemReader) {
// 		this.itemReader = itemReader;
// 	}
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/reader/item/ItemReader.java
// public interface ItemReader<T, R> {
// 
// 	/**
// 	 * @param t transform result
// 	 */
// 	R read(T t);
// 
// 	/**
// 	 * Indicates if the reader is responsible for the current context
// 	 * 
// 	 * @param context
// 	 */
// 	boolean shouldHandle(ParseContext context);
// 
// }
// 
// Path: easyxml-core/src/main/java/com/giffing/easyxml/stax/reader/context/StaxTransformerResult.java
// public class StaxTransformerResult implements TransformResult<XMLStreamReader> {
// 
// 	private XMLStreamReader reader;
// 
// 	public StaxTransformerResult(XMLStreamReader reader){
// 		this.reader = reader;
// 	}
// 	
// 	@Override
// 	public XMLStreamReader getContent() {
// 		return reader;
// 	}
// 
// }


// Path: easyxml-core/src/main/java/com/giffing/easyxml/reader/Parser.java
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.commons.lang3.StringUtils;
import com.giffing.easyxml.context.ParseContext;
import com.giffing.easyxml.context.TransformContext;
import com.giffing.easyxml.reader.item.ItemReader;
import com.giffing.easyxml.stax.reader.context.StaxTransformerResult;

		this.readers = readers;
		this.staxItemReaders = staxItemReaders;
		this.context = context;
	}

	public void setParseContext(ParseContext context) {
		this.context = context;
	}

	public R readNext() {
		return currentItemReader.read(currentReader.transform(
			new TransformContext<T, R>(streamReader, currentItemReader))
			.getContent());
	}

	public boolean hasNext() {
		if (streamReader == null) {
			doOpen();
		}
		try {
			while (streamReader.hasNext()) {
				if (streamReader.isEndElement()) {
					removePath();
				}
				if (streamReader.isStartElement()) {
					addPath();
					context.setPath(StringUtils.join(currentElementPath, "/"));
					
					for (ItemReader<XMLStreamReader, Void> staxItemReader : staxItemReaders) {
						if(staxItemReader.shouldHandle(context)) {
							staxItemReader.read(new StaxTransformerResult(streamReader).getContent());