From 3bcef21edb1caee162afba71c306788045486f51 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 28 Sep 2011 02:36:01 +0100 Subject: [PATCH] basket books loading --- TODO.litres | 2 +- .../fbreader/network/BasketItem.java | 10 +--- .../fbreader/network/INetworkLink.java | 1 - .../fbreader/network/NetworkCatalogItem.java | 21 ++++++++ .../network/NetworkURLCatalogItem.java | 21 -------- .../fbreader/network/opds/OPDSBasketItem.java | 53 +++++++++++++++++++ .../network/opds/OPDSNetworkLink.java | 13 ++--- .../core/options/ZLStringListOption.java | 32 ++--------- .../zlibrary/core/util/ZLMiscUtil.java | 27 +++++++++- 9 files changed, 111 insertions(+), 69 deletions(-) create mode 100644 src/org/geometerplus/fbreader/network/opds/OPDSBasketItem.java diff --git a/TODO.litres b/TODO.litres index 84a9f4980..436f6b52c 100644 --- a/TODO.litres +++ b/TODO.litres @@ -29,7 +29,7 @@ resources for search actions titles/summaries menu items Search actions - stop search + interrupt search reload проверить все пути регистрации diff --git a/src/org/geometerplus/fbreader/network/BasketItem.java b/src/org/geometerplus/fbreader/network/BasketItem.java index f282f3215..2c850f078 100644 --- a/src/org/geometerplus/fbreader/network/BasketItem.java +++ b/src/org/geometerplus/fbreader/network/BasketItem.java @@ -22,16 +22,14 @@ package org.geometerplus.fbreader.network; import java.util.*; import org.geometerplus.zlibrary.core.money.Money; -import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.fbreader.network.urlInfo.*; -import org.geometerplus.fbreader.network.tree.NetworkItemsLoader; -public class BasketItem extends NetworkCatalogItem { +public abstract class BasketItem extends NetworkCatalogItem { private final ZLStringListOption myBooksInBasketOption; - public BasketItem(INetworkLink link) { + protected BasketItem(INetworkLink link) { super( link, NetworkLibrary.resource().getResource("basket").getValue(), @@ -62,10 +60,6 @@ public class BasketItem extends NetworkCatalogItem { return !bookIds().isEmpty(); } - @Override - public void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException { - } - @Override public String getStringId() { return "@Basket"; diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index b3fbce4f1..d78551db0 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -55,7 +55,6 @@ public interface INetworkLink extends Comparable { BasketItem getBasketItem(); - ZLNetworkRequest bookListRequest(List bookIds, NetworkOperationData data); ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data); ZLNetworkRequest resume(NetworkOperationData data); diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 13e9e9831..0a029824e 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -22,6 +22,8 @@ package org.geometerplus.fbreader.network; import java.util.*; import org.geometerplus.zlibrary.core.util.ZLBoolean3; +import org.geometerplus.zlibrary.core.network.ZLNetworkManager; +import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -128,4 +130,23 @@ public abstract class NetworkCatalogItem extends NetworkItem { } public abstract String getStringId(); + + /** + * Performs all necessary operations with NetworkOperationData and NetworkRequest + * to complete loading children items. + * + * @param data Network operation data instance + * @param networkRequest initial network request + * + * @throws ZLNetworkException when network operation couldn't be completed + */ + protected final void doLoadChildren(NetworkOperationData data, ZLNetworkRequest networkRequest) throws ZLNetworkException { + while (networkRequest != null) { + ZLNetworkManager.Instance().perform(networkRequest); + if (data.Loader.confirmInterruption()) { + return; + } + networkRequest = data.resume(); + } + } } diff --git a/src/org/geometerplus/fbreader/network/NetworkURLCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkURLCatalogItem.java index 307dc7b94..dea2677fc 100644 --- a/src/org/geometerplus/fbreader/network/NetworkURLCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkURLCatalogItem.java @@ -20,8 +20,6 @@ package org.geometerplus.fbreader.network; import org.geometerplus.zlibrary.core.network.ZLNetworkException; -import org.geometerplus.zlibrary.core.network.ZLNetworkManager; -import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.fbreader.network.urlInfo.UrlInfo; import org.geometerplus.fbreader.network.urlInfo.UrlInfoCollection; @@ -42,25 +40,6 @@ public abstract class NetworkURLCatalogItem extends NetworkCatalogItem { super(link, title, summary, urls, accessibility, flags); } - /** - * Performs all necessary operations with NetworkOperationData and NetworkRequest - * to complete loading children items. - * - * @param data Network operation data instance - * @param networkRequest initial network request - * - * @throws ZLNetworkException when network operation couldn't be completed - */ - protected final void doLoadChildren(NetworkOperationData data, ZLNetworkRequest networkRequest) throws ZLNetworkException { - while (networkRequest != null) { - ZLNetworkManager.Instance().perform(networkRequest); - if (data.Loader.confirmInterruption()) { - return; - } - networkRequest = data.resume(); - } - } - protected String getCatalogUrl() { return getUrl(UrlInfo.Type.Catalog); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSBasketItem.java b/src/org/geometerplus/fbreader/network/opds/OPDSBasketItem.java new file mode 100644 index 000000000..bb5f94ae8 --- /dev/null +++ b/src/org/geometerplus/fbreader/network/opds/OPDSBasketItem.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.network.opds; + +import java.util.List; + +import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.zlibrary.core.util.ZLMiscUtil; + +import org.geometerplus.fbreader.network.BasketItem; +import org.geometerplus.fbreader.network.urlInfo.*; +import org.geometerplus.fbreader.network.tree.NetworkItemsLoader; + +class OPDSBasketItem extends BasketItem { + OPDSBasketItem(OPDSNetworkLink link) { + super(link); + } + + @Override + public void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException { + final List ids = bookIds(); + if (ids.isEmpty()) { + return; + } + + final OPDSNetworkLink opdsLink = (OPDSNetworkLink)Link; + String url = opdsLink.getUrl(UrlInfo.Type.ListBooks); + if (url == null) { + return; + } + url = url.replace("{ids}", ZLMiscUtil.listToString(ids)); + + final OPDSCatalogItem.State state = opdsLink.createOperationData(loader); + doLoadChildren(state, opdsLink.createNetworkData(null, url, state)); + } +} diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index d60962d80..df6310593 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -25,9 +25,10 @@ import java.io.InputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; -import org.geometerplus.zlibrary.core.util.MimeType; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; +import org.geometerplus.zlibrary.core.util.MimeType; +import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -112,7 +113,7 @@ public abstract class OPDSNetworkLink extends AbstractNetworkLink { } public ZLNetworkRequest resume(NetworkOperationData data) { - return createNetworkData(null, data.ResumeURI, (OPDSCatalogItem.State) data); + return createNetworkData(null, data.ResumeURI, (OPDSCatalogItem.State)data); } public NetworkCatalogItem libraryItem() { @@ -172,17 +173,11 @@ public abstract class OPDSNetworkLink extends AbstractNetworkLink { public BasketItem getBasketItem() { final String url = getUrl(UrlInfo.Type.ListBooks); if (url != null && myBasketItem == null) { - myBasketItem = new BasketItem(this); + myBasketItem = new OPDSBasketItem(this); } return myBasketItem; } - @Override - public ZLNetworkRequest bookListRequest(List bookIds, NetworkOperationData data) { - // TODO: implement - return null; - } - @Override public String toString() { return "OPDSNetworkLink: {super=" + super.toString() diff --git a/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java index 4f7081403..d8dc0b6fa 100644 --- a/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java +++ b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java @@ -21,34 +21,12 @@ package org.geometerplus.zlibrary.core.options; import java.util.*; +import org.geometerplus.zlibrary.core.util.ZLMiscUtil; + public class ZLStringListOption extends ZLOption { private final List myDefaultValue; private List myValue; - private static String listToString(List list) { - if (list == null || list.isEmpty()) { - return ""; - } - final StringBuilder builder = new StringBuilder(); - boolean first = true; - for (String s : list) { - if (first) { - first = false; - } else { - builder.append(","); - } - builder.append(s); - } - return builder.toString(); - } - - private static List stringToList(String str) { - if (str == null || "".equals(str)) { - return Collections.emptyList(); - } - return Arrays.asList(str.split(",")); - } - public ZLStringListOption(String group, String optionName, List defaultValue) { super(group, optionName); myDefaultValue = (defaultValue != null) ? defaultValue : Collections.emptyList(); @@ -57,9 +35,9 @@ public class ZLStringListOption extends ZLOption { public List getValue() { if (!myIsSynchronized) { - final String value = getConfigValue(listToString(myDefaultValue)); + final String value = getConfigValue(ZLMiscUtil.listToString(myDefaultValue)); if (value != null) { - myValue = stringToList(value); + myValue = ZLMiscUtil.stringToList(value); } myIsSynchronized = true; } @@ -77,7 +55,7 @@ public class ZLStringListOption extends ZLOption { if (value.equals(myDefaultValue)) { unsetConfigValue(); } else { - setConfigValue(listToString(value)); + setConfigValue(ZLMiscUtil.listToString(value)); } myIsSynchronized = true; } diff --git a/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java b/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java index 079df9333..f9cc3e49d 100644 --- a/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java +++ b/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java @@ -19,8 +19,7 @@ package org.geometerplus.zlibrary.core.util; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class ZLMiscUtil { public static boolean equals(T o0, T o1) { @@ -67,4 +66,28 @@ public abstract class ZLMiscUtil { return (text.length() >= lowerCasePattern.length()) && (text.toLowerCase().indexOf(lowerCasePattern) >= 0); } + + public static String listToString(List list) { + if (list == null || list.isEmpty()) { + return ""; + } + final StringBuilder builder = new StringBuilder(); + boolean first = true; + for (String s : list) { + if (first) { + first = false; + } else { + builder.append(","); + } + builder.append(s); + } + return builder.toString(); + } + + public static List stringToList(String str) { + if (str == null || "".equals(str)) { + return Collections.emptyList(); + } + return Arrays.asList(str.split(",")); + } }