/** * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.gistlabs.mechanize.document.documentElements; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.gistlabs.mechanize.Resource; //import com.gistlabs.mechanize.html.query.HtmlQueryStrategy; import com.gistlabs.mechanize.document.node.Node; import com.gistlabs.mechanize.util.Assert; /** * Abstract implementation stub for page elements implementing dynamic caching of representations of DOM elements. * * @author Martin Kersten<Martin.Kersten.mk@gmail.com> */ public abstract class DocumentElements<T> implements Iterable<T> { protected final Resource page; protected final List<? extends Node> nodes; private final Map<Node, T> representations = new HashMap<Node, T>(); public DocumentElements(Resource page, List<? extends Node> nodes) { Assert.notNull(nodes, "Nodes may not be null"); this.page = page; this.nodes = nodes; } public Resource getPage() { return page; } protected T getCachedOrNewRepresentation(Node node) { if(node != null) { if(!representations.containsKey(node)) representations.put(node, newRepresentation(node)); return representations.get(node); } else return null; } protected abstract T newRepresentation(Node element); public T find(String csss) { for(Node node : nodes) { Node find = node.find(csss); if(find!=null) return getCachedOrNewRepresentation(node); } return null; } /** Returns a list with all representations of all elements. */ public List<T> getAll() { List<T> result = new ArrayList<T>(); if (nodes != null) for(Node element : nodes) result.add(getCachedOrNewRepresentation(element)); return result; } public int size() { return nodes.size(); } public T get(int index) { return getCachedOrNewRepresentation(nodes.get(index)); } public Iterator<T> iterator() { return getAll().iterator(); } }