/* * Copyright (c) 2012, the Last.fm Java Project and Committers All rights * reserved. Redistribution and use of this software in source and binary forms, * with or without modification, are permitted provided that the following * conditions are met: - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. THIS SOFTWARE IS * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.cyanogenmod.eleven.lastfm; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; /** * This utility class can be used to generically generate Result objects * (usually Lists or {@link PaginatedResult}s) from an XML response using * {@link ItemFactory ItemFactories}. * * @author Janni Kovacs */ public final class ResponseBuilder { private ResponseBuilder() { } /** * @param * @param itemClass * @return */ private static ItemFactory getItemFactory(final Class itemClass) { return ItemFactoryBuilder.getFactoryBuilder().getItemFactory(itemClass); } /** * @param * @param result * @param itemClass * @return */ public static Collection buildCollection(final Result result, final Class itemClass) { return buildCollection(result, getItemFactory(itemClass)); } /** * @param * @param result * @param factory * @return */ public static Collection buildCollection(final Result result, final ItemFactory factory) { if (!result.isSuccessful()) { return Collections.emptyList(); } return buildCollection(result.getContentElement(), factory); } /** * @param * @param element * @param itemClass * @return */ public static Collection buildCollection(final DomElement element, final Class itemClass) { return buildCollection(element, getItemFactory(itemClass)); } /** * @param * @param element * @param factory * @return */ public static Collection buildCollection(final DomElement element, final ItemFactory factory) { if (element == null) { return Collections.emptyList(); } final Collection children = element.getChildren(); final Collection items = new ArrayList(children.size()); for (final DomElement child : children) { items.add(factory.createItemFromElement(child)); } return items; } /** * @param * @param result * @param itemClass * @return */ public static PaginatedResult buildPaginatedResult(final Result result, final Class itemClass) { return buildPaginatedResult(result, getItemFactory(itemClass)); } /** * @param * @param result * @param factory * @return */ public static PaginatedResult buildPaginatedResult(final Result result, final ItemFactory factory) { if (result != null) { if (!result.isSuccessful()) { return new PaginatedResult(0, 0, Collections. emptyList()); } final DomElement contentElement = result.getContentElement(); return buildPaginatedResult(contentElement, contentElement, factory); } return null; } /** * @param * @param contentElement * @param childElement * @param itemClass * @return */ public static PaginatedResult buildPaginatedResult(final DomElement contentElement, final DomElement childElement, final Class itemClass) { return buildPaginatedResult(contentElement, childElement, getItemFactory(itemClass)); } /** * @param * @param contentElement * @param childElement * @param factory * @return */ public static PaginatedResult buildPaginatedResult(final DomElement contentElement, final DomElement childElement, final ItemFactory factory) { final Collection items = buildCollection(childElement, factory); String totalPagesAttribute = contentElement.getAttribute("totalPages"); if (totalPagesAttribute == null) { totalPagesAttribute = contentElement.getAttribute("totalpages"); } final int page = Integer.parseInt(contentElement.getAttribute("page")); final int totalPages = Integer.parseInt(totalPagesAttribute); return new PaginatedResult(page, totalPages, items); } /** * @param * @param result * @param itemClass * @return */ public static T buildItem(final Result result, final Class itemClass) { return buildItem(result, getItemFactory(itemClass)); } /** * @param * @param result * @param factory * @return */ public static T buildItem(final Result result, final ItemFactory factory) { if (!result.isSuccessful()) { return null; } return buildItem(result.getContentElement(), factory); } /** * @param * @param element * @param itemClass * @return */ public static T buildItem(final DomElement element, final Class itemClass) { return buildItem(element, getItemFactory(itemClass)); } /** * @param * @param element * @param factory * @return */ private static T buildItem(final DomElement element, final ItemFactory factory) { return factory.createItemFromElement(element); } }