2010年11月21日日曜日

Evernote API を使ってみる (6) タグの作成・更新、タグつきノート

タグは単体で作成することも、ノートを作成or更新しながらついでに作ってしまうこともできる。
タグとノートはGUIDで紐づいているので、タグの名前を更新するとノートについているタグ名も変わる(当たり前だけど)。

タグを作成、更新するテストプログラム。expungeTag()はAPIキー発行時には許可されない(使えるようにするためには別途申請が必要)。

  1. public class TagTest {  
  2.   
  3.     private static String consumerKey = "consumer key";  
  4.     private static String consumerSecret = "consumer secret";  
  5.     private static String evernoteHost = "sandbox.evernote.com";  
  6.     private static String userName = "user name";  
  7.     private static String password = "password";  
  8.   
  9.     private static NoteStore.Client setupNoteStore(String evernoteHost, User user) throws TException {  
  10.         // NoteStore クライアントのセットアップ  
  11.         String noteStoreUrl = "https://" + evernoteHost + "/edam/note/" + user.getShardId();  
  12.         THttpClient trans = new THttpClient(noteStoreUrl);  
  13.         TBinaryProtocol prot = new TBinaryProtocol(trans);  
  14.         NoteStore.Client noteStore = new NoteStore.Client(prot, prot);  
  15.         return noteStore;  
  16.     }  
  17.   
  18.     public static void main(String[] args) {  
  19.         UserStore.Client userStore = null;  
  20.         NoteStore.Client noteStore = null;  
  21.         AuthenticationResult authResult = null;  
  22.         try {  
  23.             userStore = AuthUtil.setupUserStore(evernoteHost);  
  24.             authResult = AuthUtil.authenticate(userStore, consumerKey, consumerSecret, evernoteHost, userName, password);  
  25.             User user = authResult.getUser();  
  26.             String authToken = authResult.getAuthenticationToken();  
  27.               
  28.             noteStore = setupNoteStore(evernoteHost, user);  
  29.               
  30.             Notebook notebook = noteStore.getDefaultNotebook(authToken);  
  31.               
  32.             // 新規タグの作成  
  33.             System.out.println("** CREATE TAG **");  
  34.             Tag tag1 = new Tag();  
  35.             tag1.setName("tag1");  
  36.             Tag created1 = noteStore.createTag(authToken, tag1);  
  37.             System.out.println("タグ\"" + created1.getName() + "\"が作成されました。(guid=" + created1.getGuid() + ")");  
  38.             Tag tag2 = new Tag();  
  39.             tag2.setName("tag2");  
  40.             Tag created2 = noteStore.createTag(authToken, tag2);  
  41.             System.out.println("タグ\"" + created2.getName() + "\"が作成されました。(guid=" + created2.getGuid() + ")");  
  42.               
  43.             // タグつきのノートを作成  
  44.             Note note = new Note();  
  45.             note.setNotebookGuid(notebook.getGuid());  
  46.             note.setTitle("Testnote with Tags - " + new Date().getTime());  
  47.             note.addToTagGuids(created1.getGuid()); // 既存タグのGUIDを指定  
  48.             note.addToTagGuids(created2.getGuid());   
  49.             note.addToTagNames("tag3"); // ここで存在しないタグ名を指定すると自動的にタグが作成される  
  50.             Note note_created = noteStore.createNote(authToken, note);  
  51.             System.out.println("ノート\"" + note_created.getTitle() + "\"が作成されました。");  
  52.               
  53.             // ノートについているタグを取得  
  54.             List<String> tagNames = noteStore.getNoteTagNames(authToken, note_created.getGuid());  
  55.             System.out.println("Tags: ");  
  56.             for (String tagName : tagNames) {  
  57.                 System.out.println(" - " + tagName);  
  58.             }  
  59.               
  60.             // タグの取得  
  61.             System.out.println("** GET TAG **");  
  62.             Tag tag1_1 = noteStore.getTag(authToken, created1.getGuid());  
  63.             System.out.println("タグ\"" + tag1_1.getName() + "\"を取得しました。");  
  64.               
  65.             // タグの更新  
  66.             System.out.println("** UPDATE TAG **");  
  67.             tag1_1.setName("tag1_update");  
  68.             noteStore.updateTag(authToken, tag1_1);  
  69.             System.out.println("タグ\"" + tag1_1.getName() + "\"を更新しました。");  
  70.               
  71.   
  72.             // 全タグのリストを取得  
  73.             System.out.println("** LIST TAGS **");  
  74.             List<Tag> tags = noteStore.listTags(authToken);  
  75.             for (Tag tag : tags) {  
  76.                 System.out.println(" - " + tag.getName());  
  77.             }  
  78.               
  79.             // タグの削除  
  80.             // XXX デフォルトでは許可されない  
  81.             // System.out.println("** EXPUNGE TAG **");  
  82.             // noteStore.expungeTag(authToken, created1.getGuid());  
  83.         } catch (Exception e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.   
  87.     }  
  88.   
  89. }  

ちょっとはまったのが、ノートにつけられているタグ名を取得する方法。NoteStore#getNote()でとってきたノートに対してNote#getTagGuids()でGUIDのリストがとれるけれど、Note#getTagNames()だと、NullPointerException が発生してタグ名のリストがとれない。フォーラムで調べてみるとどうも、GUIDは入れてくれるけれどタグ名は入れてくれないらしい(整合性のためらしい)。getTagNames()はNote#addToTagNames()を使って(ローカルで)追加したタグ名だけをとるためのもののようだ(でもNullPointerExceptionはちょっとひどい・・・)。
GUIDのリストだけあっても仕方ないのでどうするのかと思ったら、一発でノートについているタグ名を取得するNoteStore#getNoteTagNames()というメソッドがあった。
参考: Evernote User Forum - tagNames is Empty

実行例。
** CREATE TAG **
タグ"tag1"が作成されました。(guid=dc4717bd-8faf-44d5-963e-c3a779e5faaa)
タグ"tag2"が作成されました。(guid=701dd298-ccda-4e70-b8d5-6c38b3d1291d)
ノート"Testnote with Tags - 1290311169789"が作成されました。
Tags: 
 - tag1
 - tag2
 - tag3
** GET TAG **
タグ"tag1"を取得しました。
** UPDATE TAG **
タグ"tag1_update"を更新しました。
** LIST TAGS **
 - tag1_update
 - tag2
 - tag3

0 件のコメント:

コメントを投稿