Changeset 37411

Show
Ignore:
Timestamp:
05/07/10 00:49:57 (3 years ago)
Author:
fumokmm
Message:

v1.2.0をマージ

Location:
lang/java/misc/hatenahaiku4j/trunk
Files:
18 modified
2 copied

Legend:

Unmodified
Added
Removed
  • lang/java/misc/hatenahaiku4j/trunk

    • Property svn:mergeinfo
      •  

        old new  
         1/lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping:35625-37409 
        12/lang/java/misc/hatenahaiku4j/branches/v0.0.2:35324-35341 
        23/lang/java/misc/hatenahaiku4j/tags/v0.0.2:35323 
         4/lang/java/misc/hatenahaiku4j/tags/v1.2.0-beta5:37410 
  • lang/java/misc/hatenahaiku4j/trunk/build.xml

    r35938 r37411  
    33 
    44        <!-- HatenaHaiku4Jのバージョン --> 
    5         <property name="version" value="1.1.4"/> 
     5        <property name="version" value="1.2.0"/> 
    66 
    77        <!-- 概要 --> 
  • lang/java/misc/hatenahaiku4j/trunk/changelog.txt

    r35938 r37411  
    1 HatenaHaiku4J v1.1.4 2009-11-18 1.1.4 
     1HatenaHaiku4J v1.2.0 2010-05-07 
     2        ・HatenaHaikuAPIHTML(HTMLスクレイピング版)を追加した。 
     3 
     4HatenaHaiku4J v1.1.4 2009-11-18 
    25        ・StringUtil#encodeで「+」「.」「-」「*」「_」もURLエンコードするよう修正。 
    36 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/Const.java

    r35938 r37411  
    1111        public static final String API_NAME = "HatenaHaiku4J"; 
    1212        /** バージョン */ 
    13         public static final String VERSION = "v1.1.4"; 
     13        public static final String VERSION = "v1.2.0"; 
    1414 
    1515        /** コロン */ 
     
    3232        /** mobile */ 
    3333        public static final String MOBILE = "mobile"; 
     34        /** api */ 
     35        public static final String API = "api"; 
    3436 
    3537        /** URL: はてなハイクベースURL */ 
     
    4244        /** URL: はてなハイクモバイルベースURL */ 
    4345        public static final String MOBILE_BASE_URL = BASE_URL + MOBILE + SLASH; 
    44         /** URL: はてなハイクモバイルキーワードベースURL */ 
     46        /** URL: はてなハイクモバイルIDベースURL */ 
    4547        public static final String MOBILE_ID_BASE_URL = MOBILE_BASE_URL + ID + SLASH; 
    4648        /** URL: はてなハイクモバイルキーワードベースURL */ 
     
    4951        /** URL: はてなプロフィールベースURL */ 
    5052        public static final String HATENA_PROFILE_BASE_URL = "http://www.hatena.ne.jp/"; 
     53        /** URL: はてなstベースURL */ 
     54        public static final String HATENA_ST_BASE_URL = "http://www.st-hatena.com/"; 
    5155 
     56        /** URL: はてなハイクAPIベースURL */ 
     57        public static final String API_BASE_URL = BASE_URL + API + SLASH; 
     58         
    5259        /** はてなIDプレフィックス */ 
    5360        public static final String ID_COLON = ID + COLON; 
     61        /** キーワードプレフィックス */ 
     62        public static final String KEYWORD_COLON = KEYWORD + COLON; 
    5463 
    5564        /** エンコーディング:UTF-8 */ 
     
    5766        /** 拡張子:XML (.xml) */ 
    5867        public static final String EXT_XML = ".xml"; 
     68 
     69        /** XMLヘッダ */ 
     70        public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"" + UTF8 + "\" ?>"; 
    5971} 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/EntityAPI.java

    r35467 r37411  
    11package hatenahaiku4j; 
     2 
     3import hatenahaiku4j.op.CollectOp; 
     4 
     5import java.util.ArrayList; 
     6import java.util.List; 
    27 
    38/** 
     
    1217        /** はてなハイクAPI(認証なし) */ 
    1318        protected HatenaHaikuAPILight apiLight; 
     19        /** はてなハイクAPI(HTMLスクレイピング版) */ 
     20        protected HatenaHaikuAPIHTML apiHtml; 
    1421 
    1522        /** 
     
    2936                return apiAuth != null; 
    3037        } 
     38 
     39        /** 
     40         * HTMLスクレイピング版かどうか返却します。 
     41         *  
     42         * @return HTMLスクレイピング版かどうか 
     43         * @since v1.2.0 
     44         */ 
     45        protected boolean isHTML() { 
     46                return apiHtml != null; 
     47        } 
     48 
     49        /** 
     50         * 標準の集合操作を返却します。<br/> 
     51         * {@link java.util.ArrayList}にaddしていく。 
     52         *  
     53         * @param <E> 集めるEntity 
     54         * @return 指定したEntityのArrayListによる集合操作 
     55         * @since v1.1.0 
     56         */ 
     57        static <E extends Entity<E>> CollectOp<E, List<E>> createCollectOp() { 
     58                return new CollectOp<E, List<E>>(new ArrayList<E>()); 
     59        } 
     60 
    3161} 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/HatenaHaikuAPI.java

    r35648 r37411  
    2424public class HatenaHaikuAPI extends HatenaHaikuAPILight { 
    2525        /** URL: フレンドタイムライン(XML) */ 
    26         protected static final String URL_FRIENDS_TIMELINE_XML          = "http://h.hatena.ne.jp/api/statuses/friends_timeline.xml"; 
     26        protected static final String URL_FRIENDS_TIMELINE_XML          = Const.API_BASE_URL + "statuses/friends_timeline.xml"; 
    2727        /** URL: ユーザタイムライン(XML) */ 
    28         protected static final String URL_USER_TIMELINE_XML                     = "http://h.hatena.ne.jp/api/statuses/user_timeline.xml"; 
     28        protected static final String URL_USER_TIMELINE_XML                     = Const.API_BASE_URL + "statuses/user_timeline.xml"; 
    2929        /** URL: 投稿(XML) */ 
    30         protected static final String URL_UPDATE_STATUS_XML                     = "http://h.hatena.ne.jp/api/statuses/update.xml"; 
     30        protected static final String URL_UPDATE_STATUS_XML                     = Const.API_BASE_URL + "statuses/update.xml"; 
    3131        /** URL: エントリを削除 */ 
    32         protected static final String URL_DELETE_STATUS                         = "http://h.hatena.ne.jp/api/statuses/destroy/"; 
     32        protected static final String URL_DELETE_STATUS                         = Const.API_BASE_URL + "statuses/destroy/"; 
    3333        /** URL: エントリにスターを一つ追加 */ 
    34         protected static final String URL_ADD_STAR                                      = "http://h.hatena.ne.jp/api/favorites/create/"; 
     34        protected static final String URL_ADD_STAR                                      = Const.API_BASE_URL + "favorites/create/"; 
    3535        /** URL: エントリのスターを一つ減らす */ 
    36         protected static final String URL_DELETE_STAR                                   = "http://h.hatena.ne.jp/api/favorites/destroy/"; 
     36        protected static final String URL_DELETE_STAR                                   = Const.API_BASE_URL + "favorites/destroy/"; 
    3737        /** URL: ユーザがフォローしているユーザのリスト(XML) */ 
    38         protected static final String URL_FOLLOWING_LIST_XML                    = "http://h.hatena.ne.jp/api/statuses/friends.xml"; 
     38        protected static final String URL_FOLLOWING_LIST_XML                    = Const.API_BASE_URL + "statuses/friends.xml"; 
    3939        /** URL: ユーザをフォローしているユーザのリスト(XML) */ 
    40         protected static final String URL_FOLLOWERS_LIST_XML                    = "http://h.hatena.ne.jp/api/statuses/followers.xml"; 
     40        protected static final String URL_FOLLOWERS_LIST_XML                    = Const.API_BASE_URL + "statuses/followers.xml"; 
    4141        /** URL: ユーザをフォローする */ 
    42         protected static final String URL_FOLLOW_USER                                   = "http://h.hatena.ne.jp/api/friendships/create/"; 
     42        protected static final String URL_FOLLOW_USER                                   = Const.API_BASE_URL + "friendships/create/"; 
    4343        /** URL: ユーザのフォローをやめる */ 
    44         protected static final String URL_UNFOLLOW_USER                         = "http://h.hatena.ne.jp/api/friendships/destroy/"; 
     44        protected static final String URL_UNFOLLOW_USER                         = Const.API_BASE_URL + "friendships/destroy/"; 
    4545        /** URL: ユーザがフォローしているキーワードのリスト(XML) */ 
    46         protected static final String URL_FOLLOWING_KEYWORD_LIST_XML    = "http://h.hatena.ne.jp/api/statuses/keywords.xml"; 
     46        protected static final String URL_FOLLOWING_KEYWORD_LIST_XML    = Const.API_BASE_URL + "statuses/keywords.xml"; 
    4747        /** URL: キーワードをフォローする */ 
    48         protected static final String URL_FOLLOW_KEYWORD                                = "http://h.hatena.ne.jp/api/keywords/create/"; 
     48        protected static final String URL_FOLLOW_KEYWORD                                = Const.API_BASE_URL + "keywords/create/"; 
    4949        /** URL: キーワードのフォローをやめる */ 
    50         protected static final String URL_UNFOLLOW_KEYWORD                      = "http://h.hatena.ne.jp/api/keywords/destroy/"; 
     50        protected static final String URL_UNFOLLOW_KEYWORD                      = Const.API_BASE_URL + "keywords/destroy/"; 
    5151        /** URL: 関連キーワードを設定(XML) */ 
    52         protected static final String URL_RELATE_KEYWORD_XML                    = "http://h.hatena.ne.jp/api/keywords/relation/create.xml"; 
     52        protected static final String URL_RELATE_KEYWORD_XML                    = Const.API_BASE_URL + "keywords/relation/create.xml"; 
    5353        /** URL: 関連キーワードを解除(XML) */ 
    54         protected static final String URL_UNRELATE_KEYWORD_XML          = "http://h.hatena.ne.jp/api/keywords/relation/destroy.xml"; 
     54        protected static final String URL_UNRELATE_KEYWORD_XML          = Const.API_BASE_URL + "keywords/relation/destroy.xml"; 
    5555 
    5656        /** ログインユーザ */ 
     
    127127         */ 
    128128        public List<Status> getFriendsTimeline(int page, int count, Date since) throws HatenaHaikuException { 
    129                 return getFriendsTimeline(this.<Status>createCollectOp(), page, count, since); 
     129                return getFriendsTimeline(EntityAPI.<Status>createCollectOp(), page, count, since); 
    130130        } 
    131131         
     
    218218         */ 
    219219        public List<Status> getUserTimeline(int page, int count, Date since) throws HatenaHaikuException { 
    220                 return getUserTimeline(this.<Status>createCollectOp(), page, count, since); 
     220                return getUserTimeline(EntityAPI.<Status>createCollectOp(), page, count, since); 
    221221        } 
    222222 
     
    293293         */ 
    294294        public List<Status> getHotUserTimeline(int page, int count, Date since) throws HatenaHaikuException { 
    295                 return getHotUserTimeline(this.<Status>createCollectOp(), page, count, since); 
     295                return getHotUserTimeline(EntityAPI.<Status>createCollectOp(), page, count, since); 
    296296        } 
    297297         
     
    329329        private <T> T _getUserTimeline(ReduceOp<Status, T> op, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    330330                try { 
    331                         QueryParameter param = new QueryParameter(isHot); 
     331                        QueryParameter param = new QueryParameter(); 
     332                        if (isHot) { 
     333                                param.setSort(QueryParameter.HOT);      // 人気順 
     334                        } 
    332335                        param.setPage(page); 
    333336                        param.setCount(count); 
     
    729732         */ 
    730733        public List<User> getFollowingList(int page) throws HatenaHaikuException { 
    731                 return getFollowingList(this.<User>createCollectOp(), page); 
     734                return getFollowingList(EntityAPI.<User>createCollectOp(), page); 
    732735        } 
    733736 
     
    772775         */ 
    773776        public List<User> getFollowersList() throws HatenaHaikuException { 
    774                 return getFollowersList(this.<User>createCollectOp()); 
     777                return getFollowersList(EntityAPI.<User>createCollectOp()); 
    775778        } 
    776779 
     
    883886         */ 
    884887        public List<Keyword> getFollowingKeywordList() throws HatenaHaikuException { 
    885                 return getFollowingKeywordList(this.<Keyword>createCollectOp()); 
     888                return getFollowingKeywordList(EntityAPI.<Keyword>createCollectOp()); 
    886889        } 
    887890 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/HatenaHaikuAPILight.java

    r35817 r37411  
    11package hatenahaiku4j; 
    22 
    3 import hatenahaiku4j.op.CollectOp; 
    43import hatenahaiku4j.op.ReduceOp; 
    54import hatenahaiku4j.util.DateUtil; 
     
    2928public class HatenaHaikuAPILight { 
    3029        /** URL: パブリックタイムライン(XML) */ 
    31         protected static final String URL_PUBLIC_TIMELINE_XML           = "http://h.hatena.ne.jp/api/statuses/public_timeline.xml"; 
     30        protected static final String URL_PUBLIC_TIMELINE_XML           = Const.API_BASE_URL + "statuses/public_timeline.xml"; 
    3231        /** URL: フレンドタイムライン */ 
    33         protected static final String URL_FRIENDS_TIMELINE              = "http://h.hatena.ne.jp/api/statuses/friends_timeline/"; 
     32        protected static final String URL_FRIENDS_TIMELINE              = Const.API_BASE_URL + "statuses/friends_timeline/"; 
    3433        /** URL: ユーザタイムライン */ 
    35         protected static final String URL_USER_TIMELINE                 = "http://h.hatena.ne.jp/api/statuses/user_timeline/"; 
     34        protected static final String URL_USER_TIMELINE                 = Const.API_BASE_URL + "statuses/user_timeline/"; 
    3635        /** URL: キーワードタイムライン */ 
    37         protected static final String URL_KEYWORD_TIMELINE              = "http://h.hatena.ne.jp/api/statuses/keyword_timeline/"; 
     36        protected static final String URL_KEYWORD_TIMELINE              = Const.API_BASE_URL + "statuses/keyword_timeline/"; 
    3837        /** URL: アルバムタイムライン(XML) */ 
    39         protected static final String URL_ALBUM_TIMELINE_XML            = "http://h.hatena.ne.jp/api/statuses/album.xml"; 
     38        protected static final String URL_ALBUM_TIMELINE_XML            = Const.API_BASE_URL + "statuses/album.xml"; 
    4039        /** URL: アルバムタイムライン */ 
    41         protected static final String URL_ALBUM_TIMELINE                        = "http://h.hatena.ne.jp/api/statuses/album/"; 
     40        protected static final String URL_ALBUM_TIMELINE                        = Const.API_BASE_URL + "statuses/album/"; 
    4241        /** URL: ステータス情報 */ 
    43         protected static final String URL_STATUS                                        = "http://h.hatena.ne.jp/api/statuses/show/"; 
     42        protected static final String URL_STATUS                                        = Const.API_BASE_URL + "statuses/show/"; 
    4443        /** URL: ユーザがフォローしているユーザのリスト */ 
    45         protected static final String URL_FOLLOWING_LIST                        = "http://h.hatena.ne.jp/api/statuses/friends/"; 
     44        protected static final String URL_FOLLOWING_LIST                        = Const.API_BASE_URL + "statuses/friends/"; 
    4645        /** URL: ユーザをフォローしているユーザのリスト */ 
    47         protected static final String URL_FOLLOWERS_LIST                        = "http://h.hatena.ne.jp/api/statuses/followers/"; 
     46        protected static final String URL_FOLLOWERS_LIST                        = Const.API_BASE_URL + "statuses/followers/"; 
    4847        /** URL: ユーザ情報 */ 
    49         protected static final String URL_USER                                  = "http://h.hatena.ne.jp/api/friendships/show/"; 
     48        protected static final String URL_USER                                  = Const.API_BASE_URL + "friendships/show/"; 
    5049        /** URL: ホットキーワードのリスト(XML) */ 
    51         protected static final String URL_HOT_KEYWORD_LIST_XML  = "http://h.hatena.ne.jp/api/keywords/hot.xml"; 
     50        protected static final String URL_HOT_KEYWORD_LIST_XML  = Const.API_BASE_URL + "keywords/hot.xml"; 
    5251        /** URL: キーワードのリスト(XML) */ 
    53         protected static final String URL_KEYWORD_LIST_XML              = "http://h.hatena.ne.jp/api/keywords/list.xml"; 
     52        protected static final String URL_KEYWORD_LIST_XML              = Const.API_BASE_URL + "keywords/list.xml"; 
    5453        /** URL: ユーザがフォローしているキーワードのリスト */ 
    55         protected static final String URL_FOLLOWING_KEYWORD_LIST        = "http://h.hatena.ne.jp/api/statuses/keywords/"; 
     54        protected static final String URL_FOLLOWING_KEYWORD_LIST        = Const.API_BASE_URL + "statuses/keywords/"; 
    5655        /** URL: キーワード情報 */ 
    57         protected static final String URL_KEYWORD                                       = "http://h.hatena.ne.jp/api/keywords/show/"; 
     56        protected static final String URL_KEYWORD                                       = Const.API_BASE_URL + "keywords/show/"; 
    5857 
    5958        /** HTTP通信ログ出力要否 */ 
     
    177176         */ 
    178177        public List<Status> getPublicTimeline(int page, Date since) throws HatenaHaikuException { 
    179                 return getPublicTimeline(this.<Status>createCollectOp(), page, since); 
     178                return getPublicTimeline(EntityAPI.<Status>createCollectOp(), page, since); 
    180179        } 
    181180 
     
    271270         */ 
    272271        public List<Status> getFriendsTimeline(String userId, int page, int count, Date since) throws HatenaHaikuException { 
    273                 return getFriendsTimeline(this.<Status>createCollectOp(), userId, page, count, since); 
     272                return getFriendsTimeline(EntityAPI.<Status>createCollectOp(), userId, page, count, since); 
    274273        } 
    275274         
     
    367366         */ 
    368367        public List<Status> getUserTimeline(String userId, int page, int count, Date since) throws HatenaHaikuException { 
    369                 return getUserTimeline(this.<Status>createCollectOp(), userId, page, count, since); 
     368                return getUserTimeline(EntityAPI.<Status>createCollectOp(), userId, page, count, since); 
    370369        } 
    371370         
     
    447446         */ 
    448447        public List<Status> getHotUserTimeline(String userId, int page, int count, Date since) throws HatenaHaikuException { 
    449                 return getHotUserTimeline(this.<Status>createCollectOp(), userId, page, count, since); 
     448                return getHotUserTimeline(EntityAPI.<Status>createCollectOp(), userId, page, count, since); 
    450449        } 
    451450         
     
    485484        private <T> T _getUserTimeline(ReduceOp<Status, T> op, String userId, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    486485                try { 
    487                         QueryParameter param = new QueryParameter(isHot); 
     486                        QueryParameter param = new QueryParameter(); 
     487                        if (isHot) { 
     488                                param.setSort(QueryParameter.HOT);      // 人気順 
     489                        } 
    488490                        param.setPage(page); 
    489491                        param.setCount(count); 
     
    562564         */ 
    563565        public List<Status> getIdTimeline(String userId, int page, int count, Date since) throws HatenaHaikuException { 
    564                 return getIdTimeline(this.<Status>createCollectOp(), userId, page, count, since); 
     566                return getIdTimeline(EntityAPI.<Status>createCollectOp(), userId, page, count, since); 
    565567        } 
    566568         
     
    642644         */ 
    643645        public List<Status> getKeywordTimeline(String keyword, int page, int count, Date since) throws HatenaHaikuException { 
    644                 return getKeywordTimeline(this.<Status>createCollectOp(), keyword, page, count, since); 
     646                return getKeywordTimeline(EntityAPI.<Status>createCollectOp(), keyword, page, count, since); 
    645647        } 
    646648         
     
    722724         */ 
    723725        public List<Status> getHotKeywordTimeline(String keyword, int page, int count, Date since) throws HatenaHaikuException { 
    724                 return getHotKeywordTimeline(this.<Status>createCollectOp(), keyword, page, count, since); 
     726                return getHotKeywordTimeline(EntityAPI.<Status>createCollectOp(), keyword, page, count, since); 
    725727        } 
    726728 
     
    760762        private <T> T _getKeywordTimeline(ReduceOp<Status, T> op, String keyword, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    761763                try { 
    762                         QueryParameter param = new QueryParameter(isHot); 
     764                        QueryParameter param = new QueryParameter(); 
     765                        if (isHot) { 
     766                                param.setSort(QueryParameter.HOT);      // 人気順 
     767                        } 
    763768                        param.setPage(page); 
    764769                        param.setCount(count); 
     
    833838         */ 
    834839        public List<Status> getAlbumTimeline(int page, int count, Date since) throws HatenaHaikuException { 
    835                 return getAlbumTimeline(this.<Status>createCollectOp(), page, count, since); 
     840                return getAlbumTimeline(EntityAPI.<Status>createCollectOp(), page, count, since); 
    836841        } 
    837842 
     
    928933         */ 
    929934        public List<Status> getAlbumKeywordTimeline(String keyword, int page, int count, Date since) throws HatenaHaikuException { 
    930                 return getAlbumKeywordTimeline(this.<Status>createCollectOp(), keyword, page, count, since); 
     935                return getAlbumKeywordTimeline(EntityAPI.<Status>createCollectOp(), keyword, page, count, since); 
    931936        } 
    932937         
     
    10291034         */ 
    10301035        public List<User> getFollowingList(String userId, int page) throws HatenaHaikuException { 
    1031                 return getFollowingList(this.<User>createCollectOp(), userId, page); 
     1036                return getFollowingList(EntityAPI.<User>createCollectOp(), userId, page); 
    10321037        } 
    10331038 
     
    10741079         */ 
    10751080        public List<User> getFollowersList(String userId) throws HatenaHaikuException { 
    1076                 return getFollowersList(this.<User>createCollectOp(), userId); 
     1081                return getFollowersList(EntityAPI.<User>createCollectOp(), userId); 
    10771082        } 
    10781083 
     
    11461151         */ 
    11471152        public List<Keyword> getHotKeywordList() throws HatenaHaikuException { 
    1148                 return getHotKeywordList(this.<Keyword>createCollectOp()); 
     1153                return getHotKeywordList(EntityAPI.<Keyword>createCollectOp()); 
    11491154        } 
    11501155 
     
    12191224         */ 
    12201225        public List<Keyword> getKeywordList(String searchWord, int page) throws HatenaHaikuException { 
    1221                 return getKeywordList(this.<Keyword>createCollectOp(), searchWord, page); 
     1226                return getKeywordList(EntityAPI.<Keyword>createCollectOp(), searchWord, page); 
    12221227        } 
    12231228 
     
    12661271         */ 
    12671272        public List<Keyword> getFollowingKeywordList(String userId) throws HatenaHaikuException { 
    1268                 return getFollowingKeywordList(this.<Keyword>createCollectOp(), userId); 
     1273                return getFollowingKeywordList(EntityAPI.<Keyword>createCollectOp(), userId); 
    12691274        } 
    12701275 
     
    13691374                        // お気に入られ 
    13701375                        status.setFavorited(Integer.parseInt(XmlUtil.getText(elemStatus, "favorited"))); 
    1371                         // 返信ステータスID 
     1376                        // 返信ステータスID 
    13721377                        status.setInReplyToStatusId(XmlUtil.getText(elemStatus, "in_reply_to_status_id")); 
    1373                         // 返信ユーザID 
     1378                        // 返信ユーザID 
    13741379                        status.setInReplyToUserId(XmlUtil.getText(elemStatus, "in_reply_to_user_id")); 
    13751380                        // キーワード 
     
    14981503        } 
    14991504 
    1500         /** 
    1501          * 標準の集合操作を返却します。<br/> 
    1502          * {@link java.util.ArrayList}にaddしていく。 
    1503          *  
    1504          * @param <E> 集めるEntity 
    1505          * @return 指定したEntityのArrayListによる集合操作 
    1506          * @since v1.1.0 
    1507          */ 
    1508         protected <E extends Entity<E>> CollectOp<E, List<E>> createCollectOp() { 
    1509                 return new CollectOp<E, List<E>>(new ArrayList<E>()); 
    1510         } 
    1511          
    15121505} 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/Keyword.java

    r35648 r37411  
    2323        /** キーワードタイトル */ 
    2424        private String title; 
     25        /** クラウド */ 
     26        private int cloud; 
    2527 
    2628        /** 
     
    7880 
    7981        /** 
     82         * インスタンスを取得します。(パッケージプライベート) 
     83         *  
     84         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     85         * @since v1.2.0 
     86         */ 
     87        static Keyword create(HatenaHaikuAPIHTML apiHtml) { 
     88                Keyword keyword = new Keyword(); 
     89                keyword.api.init(keyword, apiHtml); 
     90                return keyword; 
     91        } 
     92 
     93        /** 
    8094         * 投稿数を取得します。 
    8195         *  
     
    138152         
    139153        /** 
     154         * クラウドを取得します。<br/> 
     155         * クラウドはタグクラウド用の値(1~7)らしい。<br/> 
     156         * 尚、当値は、{@link HatenaHaikuAPIHTML#getHotKeywordList()}にて<br/> 
     157         * Keywordを取得時にしか設定されない値であることに注意されたい。<br/> 
     158         * (未設定時は常に0が返却されます) 
     159         *  
     160         * <table> 
     161         * <tr><th>class名</th><th>重要度</th></tr> 
     162         * <tr><td>cloud7</td><td rowspan="7">高<br/><br/>↑<br/>|<br/>↓<br/><br/>低</td></tr> 
     163         * <tr><td>cloud6</td></tr> 
     164         * <tr><td>cloud5</td></tr> 
     165         * <tr><td>cloud4</td></tr> 
     166         * <tr><td>cloud3</td></tr> 
     167         * <tr><td>cloud2</td></tr> 
     168         * <tr><td>cloud1</td></tr> 
     169         * </table> 
     170         *  
     171         *  
     172         * @return cloudの値(数値)。未設定の場合0。 
     173         * @since v1.2.0 
     174         */ 
     175        public int getCloud() { 
     176                return cloud; 
     177        } 
     178 
     179        /** 
    140180         * idページかどうかを取得します。 
    141181         *  
     
    195235        void setTitle(String title) { 
    196236                this.title = title; 
     237        } 
     238 
     239        /** 
     240         * クラウドを設定します。 
     241         *  
     242         * @param cloud クラウド 
     243         * @since v1.2.0 
     244         */ 
     245        void setCloud(int cloud) { 
     246                this.cloud = cloud; 
    197247        } 
    198248 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/KeywordAPI.java

    r35695 r37411  
    5050        } 
    5151         
     52        /** 
     53         * 初期化します。 
     54         *  
     55         * @param keyword キーワード情報 
     56         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     57         * @since v1.2.0 
     58         */ 
     59        void init(Keyword keyword, HatenaHaikuAPIHTML apiHtml) { 
     60                this.keyword = keyword; 
     61                this.apiHtml = apiHtml; 
     62        } 
     63 
    5264        // ------------------以下、認証が不要なAPI 
    5365 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/QueryParameter.java

    r35467 r37411  
    2222        /** カウントの最大値 */ 
    2323        private static final int MAX_COUNT = 200; 
    24         /** 人気順(HOT) */ 
    25         private static final String HOT = "hot"; 
     24         
     25        /** 
     26         * 人気順(HOT)として指定する際の値 
     27         */ 
     28        static final String HOT = "hot"; 
     29 
     30        /** 
     31         * アルバムとして指定する際の値 
     32         */ 
     33        static final String ALBUM = "album"; 
     34         
     35        /** 最大値を突破するかどうか */ 
     36        private boolean breakthroughMaxLimit; 
    2637         
    2738        /** その日時よりも新しい投稿のみに絞り込むための日時を指定します。  */ 
     
    3748        /** 関連付けキーワード2 */ 
    3849        private String word2; 
    39         /** 人気順 */ 
     50        /** 並び順の種類 */ 
    4051        private String sort; 
     52        /** モードの種類 */ 
     53        private String mode; 
    4154         
    4255        /** 
     
    5265         * コンストラクタです。 
    5366         *  
    54          * @param isHot 人気順取得用かどうか 
    55          * @since v1.0.0 
    56          */ 
    57         QueryParameter(boolean isHot) { 
    58                 if (isHot) { 
    59                         this.sort = HOT; 
    60                 } 
     67         * @param breakthroughMaxLimit 最大値を突破するかどうか 
     68         * @since v1.2.0 
     69         */ 
     70        QueryParameter(boolean breakthroughMaxLimit) { 
     71                this.breakthroughMaxLimit = breakthroughMaxLimit; 
    6172        } 
    6273 
     
    94105         * <li>指定されたページが0の場合、デフォルトページ(1ページ目)を取得します。</li> 
    95106         * </ul> 
     107         * ただし、breakthroughMaxLimitがtrueに指定されている場合、最大数制限は適用されません。 
    96108         *  
    97109         * @param page 取得するページ 
     
    99111         */ 
    100112        public void setPage(int page) { 
    101                 this.page = Math.min(Math.max(page, MIN_PAGE), MAX_PAGE); 
     113                if (breakthroughMaxLimit) { 
     114                        this.page = Math.max(page, MIN_PAGE); 
     115                } else { 
     116                        this.page = Math.min(Math.max(page, MIN_PAGE), MAX_PAGE); 
     117                } 
    102118        } 
    103119 
     
    119135         * <li>指定された取得数が0の場合、デフォルトの取得件数で取得します。</li> 
    120136         * </ul> 
     137         * ただし、breakthroughMaxLimitがtrueに指定されている場合、最大数制限は適用されません。 
    121138         *  
    122139         * @param count 取得数 
     
    124141         */ 
    125142        public void setCount(int count) { 
    126                 this.count = Math.min(Math.max(count, MIN_COUNT), MAX_COUNT); 
     143                if (breakthroughMaxLimit) { 
     144                        this.count = Math.max(count, MIN_COUNT); 
     145                } else { 
     146                        this.count = Math.min(Math.max(count, MIN_COUNT), MAX_COUNT); 
     147                } 
    127148        } 
    128149         
     
    188209 
    189210        /** 
    190          * 人気順を取得します。 
    191          *  
    192          * @return 人気順 
     211         * 並び順の種類を取得します。 
     212         *  
     213         * @return 並び順の種類 
    193214         * @since v1.0.0 
    194215         */ 
     
    198219 
    199220        /**  
    200          * 人気順を設定します。 
    201          *  
    202          * @param sort 人気順 
     221         * 並び順の種類を設定します。 
     222         *  
     223         * @param sort 並び順の種類 
    203224         * @since v1.0.0 
    204225         */ 
    205226        public String setSort(String sort) { 
    206227                return this.sort = sort; 
     228        } 
     229 
     230        /** 
     231         * モードの種類を取得します。 
     232         *  
     233         * @return モードの種類 
     234         * @since v1.2.0 
     235         */ 
     236        public String getMode() { 
     237                return mode; 
     238        } 
     239 
     240        /**  
     241         * モードの種類を設定します。 
     242         *  
     243         * @param mode モードの種類 
     244         * @since v1.2.0 
     245         */ 
     246        public String setMode(String mode) { 
     247                return this.mode = mode; 
    207248        } 
    208249 
     
    222263        /** sort */ 
    223264        private static final String PARAM_KEY_SORT = "sort"; 
     265        /** mode */ 
     266        private static final String PARAM_KEY_MODE = "mode"; 
    224267 
    225268        /** 
     
    258301                if (sort != null) { 
    259302                        ps.addProperty(PARAM_KEY_SORT, sort); 
     303                } 
     304                // mode 
     305                if (mode != null) { 
     306                        ps.addProperty(PARAM_KEY_MODE, mode); 
    260307                } 
    261308        } 
     
    275322                System.out.println("[word2: " + word2 + "]"); 
    276323                System.out.println("[sort: " + sort + "]"); 
     324                System.out.println("[mode: " + mode + "]"); 
    277325        } 
    278326} 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/Status.java

    r35648 r37411  
    9797         
    9898        /** 
     99         * インスタンスを取得します。(パッケージプライベート) 
     100         *  
     101         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     102         * @since v1.2.0 
     103         */ 
     104        static Status create(HatenaHaikuAPIHTML apiHtml) { 
     105                Status status = new Status(); 
     106                status.api.init(status, apiHtml); 
     107                return status; 
     108        } 
     109 
     110        /** 
    99111         * ステータスIDを取得します。 
    100112         *  
     
    204216         */ 
    205217        public List<Status> getReplies() { 
    206                 // 自動更新するなら 
    207                 if (api.apiLight.isAutoRefreshReplies()) { 
     218                // 自動更新するなら(APIHTMLでない場合のみ) 
     219                if (api.apiLight != null && api.apiLight.isAutoRefreshReplies()) { 
    208220                        if (shadow) { 
    209221                                try { 
     
    255267         */ 
    256268        public String getUserId() { 
    257                 return user.getUserId(); 
     269                return user == null ? "" : user.getUserId(); 
    258270        } 
    259271 
     
    266278         */ 
    267279        public String getUserIdNotation() { 
    268                 return user.getUserIdNotation(); 
     280                return user == null ? "" : user.getUserIdNotation(); 
    269281        } 
    270282 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/StatusAPI.java

    r35467 r37411  
    4848         
    4949        /** 
     50         * 初期化します。 
     51         *  
     52         * @param status ステータス情報 
     53         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     54         * @since v1.2.0 
     55         */ 
     56        void init(Status status, HatenaHaikuAPIHTML apiHtml) { 
     57                this.status = status; 
     58                this.apiHtml = apiHtml; 
     59        } 
     60 
     61        /** 
    5062         * このステータスを返信先状態に取得しなおします。 
    5163         *  
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/User.java

    r35648 r37411  
    7474 
    7575        /** 
     76         * インスタンスを取得します。(パッケージプライベート) 
     77         *  
     78         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     79         * @since v1.2.0 
     80         */ 
     81        static User create(HatenaHaikuAPIHTML apiHtml) { 
     82                User user = new User(); 
     83                user.api.init(user, apiHtml); 
     84                return user; 
     85        } 
     86 
     87        /** 
     88         * ユーザIDから設定できる項目をある程度埋めたインスタンスを取得します。(パッケージプライベート) 
     89         *  
     90         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     91         * @param userId ユーザID 
     92         * @since v1.2.0 
     93         */ 
     94        static User create(HatenaHaikuAPIHTML apiHtml, String userId) { 
     95                User user = create(apiHtml); 
     96                // ユーザID 
     97                user.setUserId(userId); 
     98                // ユーザ名 
     99                user.setName(userId); 
     100                // ユーザプロフィール画像URL 
     101                user.setProfileImageUrl(Const.HATENA_ST_BASE_URL + "users" 
     102                                + Const.SLASH + userId.substring(0, 2) + Const.SLASH + userId 
     103                                + Const.SLASH + "profile.gif"); 
     104                // ユーザ表示名 
     105                user.setScreenName(userId); 
     106                // ユーザのエントリページのURL 
     107                user.setUrl(Const.BASE_URL + userId + Const.SLASH); 
     108                return user; 
     109        } 
     110 
     111        /** 
    76112         * ユーザ名を取得します。 
    77113         *  
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/UserAPI.java

    r35695 r37411  
    5050        } 
    5151 
     52        /** 
     53         * 初期化します。 
     54         *  
     55         * @param user ユーザ情報 
     56         * @param apiHtml はてなハイクAPI(HTMLスクレイピング版) 
     57         * @since v1.2.0 
     58         */ 
     59        void init(User user, HatenaHaikuAPIHTML apiHtml) { 
     60                this.user = user; 
     61                this.apiHtml = apiHtml; 
     62        } 
     63 
    5264        // ------------------以下、認証が不要なAPI 
    5365 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/sample/Sample001.java

    r35665 r37411  
    55import hatenahaiku4j.HatenaHaikuAPILight; 
    66import hatenahaiku4j.HatenaHaikuException; 
     7import hatenahaiku4j.Keyword; 
    78import hatenahaiku4j.LoginUser; 
    89import hatenahaiku4j.Status; 
     
    8889                sb.append(HatenaUtil.formatDate(status.getCreatedAt())); 
    8990                sb.append("〔☆×").append(status.getFavorited()).append("〕"); 
    90                 sb.append(status.getText()); 
    9191                if (!StringUtil.isEmpty(status.getInReplyToStatusId())) { 
    92                         sb.append(" reply to ").append(status.getInReplyToUserId()); 
     92                        sb.append(" @").append(status.getInReplyToUserId()) 
     93                        .append("(").append(status.getInReplyToStatusId()).append(")"); 
    9394                } 
     95                sb.append(" ").append(status.getText()); 
    9496                sb.append(" by ").append(status.getUserId()); 
    9597                sb.append(" from ").append(status.getSource()); 
     
    101103                                } 
    102104                                replies.append(reply.getUserId()); 
     105                                replies.append("(").append(reply.getStatusId()).append(")"); 
    103106                        } 
    104107                        sb.append(" replied from ").append(replies); 
    105108                } 
     109                System.out.println(sb.toString()); 
     110        } 
     111 
     112        /** 
     113         * キーワード情報を標準出力に出力します。 
     114         *  
     115         * @param keyword キーワード情報 
     116         */ 
     117        public static void printKeyword(Keyword keyword) { 
     118                StringBuilder sb = new StringBuilder(); 
     119                sb.append("【").append(keyword.getTitle()).append("】"); 
     120                sb.append("(" + keyword.getEntryCount() + ")"); 
     121                sb.append(" cloud").append(keyword.getCloud()); 
     122                sb.append(" "); 
     123                sb.append(keyword.getLink()); 
    106124                System.out.println(sb.toString()); 
    107125        } 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/util/HttpUtil.java

    r35469 r37411  
    223223                        String line; 
    224224                        while((line = responseReader.readLine()) != null) { 
     225                                if (responseBody.length() > 0) { 
     226                                        responseBody.append("\r\n"); 
     227                                } 
    225228                                responseBody.append(line); 
    226229                        } 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/util/StringUtil.java

    r35938 r37411  
    9595                + String.valueOf(Math.random()).replaceAll("[-.]", ""); 
    9696        } 
    97  
     97         
     98        /** 
     99         * 一括置換を行います。<br/> 
     100         * templateがnull, replaceがnullまたは長さが不正(2の倍数でない)場合、空文字を返却します。 
     101         *  
     102         * @param template 置換を施すベースとなるテンプレート 
     103         * @param replace 置換文字列 
     104         * @return 一括置換された文字列 
     105         * @since v1.2.0 
     106         */ 
     107        public static String lumpReplace(String template, String... replace) { 
     108                if (template == null) { 
     109                        return ""; 
     110                } 
     111                if (replace == null) { 
     112                        return ""; 
     113                } 
     114                if (replace.length < 2 || replace.length % 2 != 0) { 
     115                        return ""; 
     116                } 
     117                String result = template; 
     118                for (int i = 0; i < replace.length; i += 2) { 
     119                        result = result.replaceAll(replace[i], replace[i + 1]); 
     120                } 
     121                return result; 
     122        } 
     123         
    98124} 
  • lang/java/misc/hatenahaiku4j/trunk/src/hatenahaiku4j/util/XmlUtil.java

    r35467 r37411  
    3838         * @since v0.0.1 
    3939         */ 
    40         public static Element getRootElement(String resultXml) throws ParserConfigurationException, UnsupportedEncodingException, SAXException, IOException { 
     40        public static Element getRootElement(String resultXml) 
     41                        throws ParserConfigurationException, UnsupportedEncodingException, 
     42                        SAXException, IOException { 
     43                 
    4144                // ドキュメントビルダーファクトリを生成 
    4245                DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); 
     46                dbfactory.setIgnoringElementContentWhitespace(true); // 余分なホワイトスペースは削除 
     47                dbfactory.setIgnoringComments(true);                 // コメントノードは不要 
     48                 
    4349                // ドキュメントビルダーを生成 
    4450                DocumentBuilder builder = dbfactory.newDocumentBuilder(); 
     51 
    4552                // パースを実行してDocumentオブジェクトを取得 
    46                 Document doc = builder.parse(new ByteArrayInputStream(resultXml.getBytes(Const.UTF8))); 
     53                Document doc = builder.parse( 
     54                        new ByteArrayInputStream( 
     55                                escapeAmp(removeIllegalChar(resultXml)).getBytes(Const.UTF8) 
     56                        ) 
     57                ); 
    4758 
    4859                return doc.getDocumentElement(); 
     
    144155                return result; 
    145156        } 
     157 
     158        /** 
     159         * 0x1bを除去する。 
     160         *  
     161         * @param source 元の文字列 
     162         * @return 0x1bを除去後の文字列 
     163         * @since v1.2.0 
     164         */ 
     165        private static String removeIllegalChar(String source) { 
     166                return source.replaceAll(new String(new char[]{ (char)0x1b }), ""); 
     167        } 
     168 
     169        /** 
     170         * &amp; を &amp;amp; に変換します。 
     171         *  
     172         * @param source 元の文字列 
     173         * @return 変換した文字列 
     174         * @since v1.2.0 
     175         */ 
     176        private static String escapeAmp(String source) { 
     177                /* 
     178                 * thanks: 
     179                 * http://www.tipsblogger.com/2009/02/reference-to-entity-xx-must-end-with.html 
     180                 */ 
     181                return source.replaceAll("&", "&amp;"); 
     182        } 
     183 
    146184}