Instance: use getInstance()
[nikiroo-utils.git] / src / be / nikiroo / fanfix / searchable / BasicSearchable.java
index ebc509611856b0a6f6d699a64c7a96592a68428a..b943abd25401f426bad456140eea004be06437fb 100644 (file)
@@ -34,6 +34,38 @@ public abstract class BasicSearchable {
                support = BasicSupport.getSupport(getType(), null);
        }
 
+       /**
+        * Find the given tag by its hierarchical IDs.
+        * <p>
+        * I.E., it will take the tag A, subtag B, subsubtag C...
+        * 
+        * @param ids
+        *            the IDs to look for
+        * 
+        * @return the appropriate tag fully filled, or NULL if not found
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       public SearchableTag getTag(Integer... ids) throws IOException {
+               SearchableTag tag = null;
+               List<SearchableTag> tags = getTags();
+
+               for (Integer tagIndex : ids) {
+                       // ! 1-based index !
+                       if (tagIndex == null || tags == null || tagIndex <= 0
+                                       || tagIndex > tags.size()) {
+                               return null;
+                       }
+
+                       tag = tags.get(tagIndex - 1);
+                       fillTag(tag);
+                       tags = tag.getChildren();
+               }
+
+               return tag;
+       }
+
        /**
         * The support type.
         * 
@@ -85,6 +117,34 @@ public abstract class BasicSearchable {
         */
        abstract public void fillTag(SearchableTag tag) throws IOException;
 
+       /**
+        * Search for the given term and return the number of pages of results of
+        * stories satisfying this search term.
+        * 
+        * @param search
+        *            the term to search for
+        * 
+        * @return a number of pages
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       abstract public int searchPages(String search) throws IOException;
+
+       /**
+        * Search for the given tag and return the number of pages of results of
+        * stories satisfying this tag.
+        * 
+        * @param tag
+        *            the tag to search for
+        * 
+        * @return a number of pages
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       abstract public int searchPages(SearchableTag tag) throws IOException;
+
        /**
         * Search for the given term and return a list of stories satisfying this
         * search term.
@@ -96,13 +156,16 @@ public abstract class BasicSearchable {
         * 
         * @param search
         *            the term to search for
+        * @param page
+        *            the page to use for result pagination, index is 1-based
         * 
         * @return a list of stories that satisfy that search term
         * 
         * @throws IOException
         *             in case of I/O error
         */
-       abstract public List<MetaData> search(String search) throws IOException;
+       abstract public List<MetaData> search(String search, int page)
+                       throws IOException;
 
        /**
         * Search for the given tag and return a list of stories satisfying this
@@ -113,7 +176,7 @@ public abstract class BasicSearchable {
         * <p>
         * URL is guaranteed to be usable, LUID will always be NULL.
         * 
-        * @param tagId
+        * @param tag
         *            the tag to search for
         * @param page
         *            the page to use for result pagination (see
@@ -159,8 +222,7 @@ public abstract class BasicSearchable {
         *             in case of I/O error
         */
        protected Document load(URL url, boolean stable) throws IOException {
-               return DataUtil.load(Instance.getCache().open(url, support, stable),
-                               "UTF-8", url.toString());
+               return DataUtil.load(Instance.getInstance().getCache().open(url, support, stable), "UTF-8", url.toString());
        }
 
        /**
@@ -168,41 +230,44 @@ public abstract class BasicSearchable {
         * type, or NULL if it does not exist.
         * 
         * @param type
-        *            the type, must not be NULL
+        *            the type, can be NULL (will just return NULL, since we do not
+        *            support it)
         * 
         * @return an implementation that supports it, or NULL
         */
-       public static BasicSearchable getSearchable(SupportType type) {
+       static public BasicSearchable getSearchable(SupportType type) {
                BasicSearchable support = null;
 
-               switch (type) {
-               case FIMFICTION:
-                       // TODO
-                       break;
-               case FANFICTION:
-                       support = new Fanfiction(type);
-                       break;
-               case MANGAFOX:
-                       // TODO
-                       break;
-               case E621:
-                       // TODO
-                       break;
-               case YIFFSTAR:
-                       // TODO
-                       break;
-               case E_HENTAI:
-                       // TODO
-                       break;
-               case MANGA_LEL:
-                       // TODO
-                       break;
-               case CBZ:
-               case HTML:
-               case INFO_TEXT:
-               case TEXT:
-               case EPUB:
-                       break;
+               if (type != null) {
+                       switch (type) {
+                       case FIMFICTION:
+                               // TODO
+                               break;
+                       case FANFICTION:
+                               support = new Fanfiction(type);
+                               break;
+                       case MANGAHUB:
+                               // TODO
+                               break;
+                       case E621:
+                               // TODO
+                               break;
+                       case YIFFSTAR:
+                               // TODO
+                               break;
+                       case E_HENTAI:
+                               // TODO
+                               break;
+                       case MANGA_LEL:
+                               support = new MangaLel();
+                               break;
+                       case CBZ:
+                       case HTML:
+                       case INFO_TEXT:
+                       case TEXT:
+                       case EPUB:
+                               break;
+                       }
                }
 
                return support;