// Path: src/main/java/name/raev/kaloyan/kindle/chitanka/model/search/BaseContentHandler.java
// public class BaseContentHandler implements ContentHandler {
// 
// 	protected Stack objects = new Stack();
// 
// 	public void startJSON() throws ParseException, IOException {
// 	}
// 
// 	public void endJSON() throws ParseException, IOException {
// 	}
// 
// 	public boolean startArray() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean endArray() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean startObject() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean endObject() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean startObjectEntry(String key) throws ParseException, IOException {
// 		objects.push(key);
// 		return true;
// 	}
// 
// 	public boolean endObjectEntry() throws ParseException, IOException {
// 		objects.pop();
// 		return true;
// 	}
// 
// 	public boolean primitive(Object value) throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	protected String getParentKey() {
// 		return objects.isEmpty() ? null : (String) objects.peek();
// 	}
// 
// 	protected String getParentKey(int depth) {
// 		return (objects.size() < depth) ? null : (String) objects.elementAt(objects.size() - 2);
// 	}
// 
// }
// 
// Path: src/main/java/name/raev/kaloyan/kindle/chitanka/model/search/SearchParser.java
// public abstract class SearchParser {
// 	
// 	protected abstract ContentHandler getContentHandler();
// 
// 	protected void parse(String url) throws IOException, ParseException {
// 		Reader reader = new BufferedReader(new InputStreamReader(Network.getInputStream(url)));
// 
// 		new JSONParser().parse(reader, getContentHandler());
// 	}
// 
// }


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.parser.ContentHandler;
import org.json.simple.parser.ParseException;
import name.raev.kaloyan.kindle.chitanka.model.search.BaseContentHandler;
import name.raev.kaloyan.kindle.chitanka.model.search.SearchParser;

	public Category[] getCategories() {
		return (Category[]) categories.toArray(new Category[categories.size()]);
	}

	protected ContentHandler getContentHandler() {
		return new BaseContentHandler() {

			public boolean endArray() throws ParseException, IOException {
				return !CATEGORIES_KEY.equals(getParentKey());
			}

			public boolean startObject() throws ParseException, IOException {
				if (CATEGORIES_KEY.equals(getParentKey())) {
					categories.add(new Category());
				}
				return true;
			}

			public boolean primitive(Object value) throws ParseException, IOException {
				String key = (String) objects.peek();
				if ("slug".equals(key)) {
					if (CATEGORIES_KEY.equals(getParentKey(2))) {
						getLast().setSlug((String) value);
					}
				} else if ("name".equals(key)) {
					if (CATEGORIES_KEY.equals(getParentKey(2))) {
						getLast().setName((String) value);
					}
				} else if ("nrOfBooks".equals(key)) {
// Path: src/main/java/name/raev/kaloyan/kindle/chitanka/model/search/BaseContentHandler.java
// public class BaseContentHandler implements ContentHandler {
// 
// 	protected Stack objects = new Stack();
// 
// 	public void startJSON() throws ParseException, IOException {
// 	}
// 
// 	public void endJSON() throws ParseException, IOException {
// 	}
// 
// 	public boolean startArray() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean endArray() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean startObject() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean endObject() throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	public boolean startObjectEntry(String key) throws ParseException, IOException {
// 		objects.push(key);
// 		return true;
// 	}
// 
// 	public boolean endObjectEntry() throws ParseException, IOException {
// 		objects.pop();
// 		return true;
// 	}
// 
// 	public boolean primitive(Object value) throws ParseException, IOException {
// 		return true;
// 	}
// 
// 	protected String getParentKey() {
// 		return objects.isEmpty() ? null : (String) objects.peek();
// 	}
// 
// 	protected String getParentKey(int depth) {
// 		return (objects.size() < depth) ? null : (String) objects.elementAt(objects.size() - 2);
// 	}
// 
// }
// 
// Path: src/main/java/name/raev/kaloyan/kindle/chitanka/model/search/SearchParser.java
// public abstract class SearchParser {
// 	
// 	protected abstract ContentHandler getContentHandler();
// 
// 	protected void parse(String url) throws IOException, ParseException {
// 		Reader reader = new BufferedReader(new InputStreamReader(Network.getInputStream(url)));
// 
// 		new JSONParser().parse(reader, getContentHandler());
// 	}
// 
// }


// Path: src/main/java/name/raev/kaloyan/kindle/chitanka/model/search/category/SearchCategories.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.parser.ContentHandler;
import org.json.simple.parser.ParseException;
import name.raev.kaloyan.kindle.chitanka.model.search.BaseContentHandler;
import name.raev.kaloyan.kindle.chitanka.model.search.SearchParser;


	public Category[] getCategories() {
		return (Category[]) categories.toArray(new Category[categories.size()]);
	}

	protected ContentHandler getContentHandler() {
		return new BaseContentHandler() {

			public boolean endArray() throws ParseException, IOException {
				return !CATEGORIES_KEY.equals(getParentKey());
			}

			public boolean startObject() throws ParseException, IOException {
				if (CATEGORIES_KEY.equals(getParentKey())) {
					categories.add(new Category());
				}
				return true;
			}

			public boolean primitive(Object value) throws ParseException, IOException {
				String key = (String) objects.peek();
				if ("slug".equals(key)) {
					if (CATEGORIES_KEY.equals(getParentKey(2))) {
						getLast().setSlug((String) value);
					}
				} else if ("name".equals(key)) {
					if (CATEGORIES_KEY.equals(getParentKey(2))) {
						getLast().setName((String) value);
					}
				} else if ("nrOfBooks".equals(key)) {
					if (CATEGORIES_KEY.equals(getParentKey(2))) {