From 3bf2d0ef8bfad67d85678d3aa5f34d3730adc4fd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Feb 2011 19:42:48 +0000 Subject: [PATCH] Some logical changes to the fbreader/network core Conflicts: TODO.SOAP --- TODO.SOAP | 8 ++++ .../fbreader/network/AbstractNetworkLink.java | 19 +++++---- .../fbreader/network/INetworkLink.java | 11 ++++- .../fbreader/network/NetworkCatalogItem.java | 40 ++++++++++++------- .../fbreader/network/NetworkLibrary.java | 2 +- .../network/NetworkOperationData.java | 12 ++++-- .../litres/LitResBookshelfItem.java | 10 +---- .../network/opds/OPDSCatalogItem.java | 26 +++++------- .../network/opds/OPDSNetworkLink.java | 5 +-- 9 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 TODO.SOAP diff --git a/TODO.SOAP b/TODO.SOAP new file mode 100644 index 000000000..fb8279afd --- /dev/null +++ b/TODO.SOAP @@ -0,0 +1,8 @@ +* response parser: add namespaces processing +* return full result from response parser +* full SOAP types list: support in request and in parser + + +** коды возврата для работы приложения не требуются: при возникновении ошибок на стороне сервера перехватывать их и отправлять по SOAP в событии fault +** какой vendor_id ????? +** что такое marketplace_id ????? diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 0fbb794fb..6fa1c681c 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -52,37 +52,36 @@ public abstract class AbstractNetworkLink implements INetworkLink { myLinks = new TreeMap(links); } - public String getSiteName() { + public final String getSiteName() { return mySiteName; } - public String getTitle() { + public final String getTitle() { return myTitle; } - public String getSummary() { + public final String getSummary() { return mySummary; } - public String getIcon() { + public final String getIcon() { return myIcon; } - public String getLanguage() { + public final String getLanguage() { return myLanguage; } - public String getLink(String urlKey) { + public final String getLink(String urlKey) { return myLinks.get(urlKey); } - public Set getLinkKeys() { + public final Set getLinkKeys() { return myLinks.keySet(); } - public NetworkOperationData createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener) { - return new NetworkOperationData(link, listener); + public NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener) { + return new NetworkOperationData(this, listener); } @Override diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index f2cdd6fdb..105174aaf 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -41,12 +41,19 @@ public interface INetworkLink { String getSummary(); String getIcon(); String getLink(String urlKey); + + /** + * @return 2-letters language code or special token "multi" + */ String getLanguage(); Set getLinkKeys(); - NetworkOperationData createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener); + /** + * @param listener Network operation listener + * @return instance, which represents the state of the network operation. + */ + NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener); 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 967ae60f9..739bc577c 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -23,6 +23,8 @@ import java.util.*; import org.geometerplus.zlibrary.core.util.ZLBoolean3; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.zlibrary.core.network.ZLNetworkManager; +import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; public abstract class NetworkCatalogItem extends NetworkLibraryItem { @@ -56,21 +58,6 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { this(link, title, summary, cover, urlByType, VISIBLE_ALWAYS, CATALOG_OTHER); } - /** - * Creates new NetworkCatalogItem instance with specified visibility and CATALOG_OTHER type. - * - * @param link corresponding NetworkLink object. Must be not null. - * @param title title of this library item. Must be not null. - * @param summary description of this library item. Can be null. - * @param cover cover url. Can be null. - * @param urlByType map contains URLs and their types. Must be not null. - * @param visibility value defines when this library item will be shown in the network library. - * Can be one of the VISIBLE_* values. - */ - public NetworkCatalogItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility) { - this(link, title, summary, cover, urlByType, visibility, CATALOG_OTHER); - } - /** * Creates new NetworkCatalogItem instance with specified visibility and type. * @@ -113,6 +100,9 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { public void onDisplayItem() { } + /** + * @return visibility status: on of the values from ZLBoolean3 class. + */ public int getVisibility() { if (Visibility == VISIBLE_ALWAYS) { return ZLBoolean3.B3_TRUE; @@ -130,4 +120,24 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { } return ZLBoolean3.B3_FALSE; } + + /** + * 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.Listener.confirmInterrupt()) { + return; + } + networkRequest = data.resume(); + } + } } diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 7f276b73f..876b455e8 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -442,7 +442,7 @@ public class NetworkLibrary { synchronized (myLinks) { for (INetworkLink link : activeLinks()) { - final NetworkOperationData data = link.createOperationData(link, synchronizedListener); + final NetworkOperationData data = link.createOperationData(synchronizedListener); final ZLNetworkRequest request = link.simpleSearchRequest(pattern, data); if (request != null) { dataList.add(data); diff --git a/src/org/geometerplus/fbreader/network/NetworkOperationData.java b/src/org/geometerplus/fbreader/network/NetworkOperationData.java index 33182660a..256336808 100644 --- a/src/org/geometerplus/fbreader/network/NetworkOperationData.java +++ b/src/org/geometerplus/fbreader/network/NetworkOperationData.java @@ -29,8 +29,12 @@ public class NetworkOperationData { void commitItems(INetworkLink link); - // returns true to confirm interrupt reading; return false to continue reading. - // once true has been returned, all next calls must return true. + /** + * @return true to confirm interrupt reading; + * false to continue reading. + * Once true has been returned, + * all next calls MUST return true. + */ boolean confirmInterrupt(); } @@ -43,11 +47,11 @@ public class NetworkOperationData { Listener = listener; } - public void clear() { + protected void clear() { ResumeURI = null; } - public ZLNetworkRequest resume() { + public final ZLNetworkRequest resume() { final ZLNetworkRequest request = Link.resume(this); clear(); return request; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index a459b0d99..a45a70cb7 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -49,16 +49,8 @@ class SortedCatalogItem extends NetworkCatalogItem { public class LitResBookshelfItem extends NetworkCatalogItem { private boolean myForceReload; - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType) { - super(link, title, summary, cover, urlByType); - } - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility) { - super(link, title, summary, cover, urlByType, visibility); - } - - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility, int catalogType) { - super(link, title, summary, cover, urlByType, visibility, catalogType); + super(link, title, summary, cover, urlByType, visibility, CATALOG_OTHER); } @Override diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java b/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java index 8c2a8cf88..6152a221c 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java @@ -21,7 +21,6 @@ package org.geometerplus.fbreader.network.opds; import java.util.*; -import org.geometerplus.zlibrary.core.network.ZLNetworkManager; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; @@ -49,19 +48,12 @@ class OPDSCatalogItem extends NetworkCatalogItem { myExtraData = null; } - private void doLoadChildren(NetworkOperationData.OnNewItemListener listener, - ZLNetworkRequest networkRequest) throws ZLNetworkException { - while (networkRequest != null) { - try { - ZLNetworkManager.Instance().perform(networkRequest); - } catch (ZLNetworkException e) { - myLoadingState = null; - throw e; - } - if (listener.confirmInterrupt()) { - return; - } - networkRequest = myLoadingState.resume(); + private void doLoadChildren(ZLNetworkRequest networkRequest) throws ZLNetworkException { + try { + super.doLoadChildren(myLoadingState, networkRequest); + } catch (ZLNetworkException e) { + myLoadingState = null; + throw e; } } @@ -74,12 +66,12 @@ class OPDSCatalogItem extends NetworkCatalogItem { public final void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { OPDSNetworkLink opdsLink = (OPDSNetworkLink) Link; - myLoadingState = opdsLink.createOperationData(Link, listener); + myLoadingState = opdsLink.createOperationData(listener); ZLNetworkRequest networkRequest = opdsLink.createNetworkData(URLByType.get(URL_CATALOG), myLoadingState); - doLoadChildren(listener, networkRequest); + doLoadChildren(networkRequest); } @Override @@ -92,7 +84,7 @@ class OPDSCatalogItem extends NetworkCatalogItem { if (myLoadingState != null) { myLoadingState.Listener = listener; ZLNetworkRequest networkRequest = myLoadingState.resume(); - doLoadChildren(listener, networkRequest); + doLoadChildren(networkRequest); } } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 2328d27c8..0d0cef9bd 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -121,9 +121,8 @@ class OPDSNetworkLink extends AbstractNetworkLink { } @Override - public OPDSCatalogItem.State createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener) { - return new OPDSCatalogItem.State(link, listener); + public OPDSCatalogItem.State createOperationData(NetworkOperationData.OnNewItemListener listener) { + return new OPDSCatalogItem.State(this, listener); } public ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data) {