• 基本技術検証

    By Muneyuki Ohkawa 2 decades ago

    Google Calendar Data APIを使って、NotesからJavaScriptでアクセスできるのか検証したいと思います。

    以下に基本的に必要となる処理を4つ挙げました。

    NAT33さん、divinglifeさん、出来ますでしょうか?


    1. Googleカレンダー項目を1つ追加する。

      検証なので、Notesのカレンダーを読み込んでそれをGoogle Calendarに追加するということは必要ではなく、カレンダー項目はハードコーディングでOKです。URLやGoogleアカウント名、パスワードもハードコーディングでかまいません。



      2.Googleカレンダー項目の削除

      何をキーにして対象カレンダー項目を削除するのかがポイントとなるでしょうね。UNIDかな。


    2. Googleカレンダー項目の更新

      削除と同様に、キー項目をどうするかがポイントです。



      4.Googleカレンダー項目のリストを取得する。

      ある日付以降のカレンダー項目一覧を取得するということをテストしたいです。同期させるロジックを組む際には、絶対必要となってくる処理です。同期を考えると、更新日時の取得も必要です。
    • 現在、検証中ですが

      By Toshiaki Nakamura 2 decades ago

      とりあえず、1番について取り掛かっているのですが、以下のJavaエージェントのコードのコンパイルで困っています。



      import lotus.domino.;



      import com.google.gdata.client.
      ;

      import com.google.gdata.client.calendar.;

      import com.google.gdata.data.
      ;

      import com.google.gdata.data.acl.;

      import com.google.gdata.data.calendar.
      ;

      import com.google.gdata.data.extensions.;

      import com.google.gdata.util.
      ;

      import java.net.URL;



      public class JavaAgent extends AgentBase {


      public void NotesMain() {<br/>
      


          try {<br/>
                   Session session = getSession();<br/>
                  AgentContext agentContext = <br/>
                   session.getAgentContext();<br/>
       // (Your code goes here) <br/>
      

      //

      CalendarService myService = new CalendarService("exampleCo-exampleApp-1");

      myService.setUserCredentials("icd11559@gmail.com", "ここにパスワードが入る");



      URL postUrl = new URL("http://www.google.com/calendar/feeds/icd11559@gmail.com/private/full");

      EventEntry myEntry = new EventEntry();



      myEntry.setTitle(new PlainTextConstruct("Tennis with Beth"));

      myEntry.setContent(new PlainTextConstruct("Meet for a quick lesson."));



      com.google.gdata.data.DateTime startTime = com.google.gdata.data.DateTime.parseDateTime("2009-04-17T15:00:00-08:00");

      com.google.gdata.data.DateTime endTime = com.google.gdata.data.DateTime.parseDateTime("2009-04-17T17:00:00-08:00");



      When eventTimes = new When();

      eventTimes.setStartTime(startTime);

      eventTimes.setEndTime(endTime);

      myEntry.addTime(eventTimes);



      // Send the request and receive the response:

      EventEntry insertedEntry = myService.insert(postUrl, myEntry);


          } catch(Exception e) {<br/>
              e.printStackTrace();<br/>
          }<br/>
      }<br/>
      

      }



      下記の部分でコンパイルがエラーしてしまうのです。サンプルコードそのままなのですが、



      EventEntry insertedEntry = myService.insert(postUrl, myEntry);



      Domino側の問題なのか、APIの問題なのか分からない状態です。



      私の環境の問題の可能性もありますので、どなたか試していただけませんか?

      • JavaCompilerTarget=1.5

        By Muneyuki Ohkawa 2 decades ago

        もしかしたら、notes.iniにJavaCompilerTarget=1.5を入れる必要があるかもしれません。

        このiniパラメータは、コードがJDK1.5の機能を使っている場合に必要な設定です。リリースノートに詳細な記載

        があります。



        技術検証のフェーズが一番面白いので、私もコーディングに参加したいのですが、業務の方が今週9(木)まで

        立て込んでいて、なかなか手をつけられずにいます。申し訳ございません。木曜日以降、がんばります!

        • コンパイルは出来ましたが・・・

          By Hirotaka Nagashima 2 decades ago

          JavaCompilerTarget=1.5 でコンパイルは可能ですが、Java.policyの設定が必要でした。

          ただ、実行すると以下のようにRedirect URLが指定されていない旨のエラーが出て失敗します。









          検証手順:


          1. 以下のURLからライブラリをダウンロード

            http://code.google.com/p/gdata-java-client/


          2. 解凍したファイルのうち、gdata\java\lib を <Program Directory>\jvm\lib\ext に展開

             # JavaUserClasses の指定を取り急ぎ回避。あとで消したければgdataから始まるjarファイルをすべて消します


          3. <Program Directory>\jvm\lib\security\java.policy を以下のように編集します。



            Before:

            grant codeBase "file:${java.home}/lib/ext/" {

            permission java.security.AllPermission;

            };



            After:

            grant{

            permission java.security.AllPermission;

            };

            //grant codeBase "file:${java.home}/lib/ext/
            " {

            // permission java.security.AllPermission;

            //};


            セキュリティ的には最低の設定ですが、適切なセキュリティ設定は後々考慮する必要があると思います。


          4. Notes.ini に JavaCompilerTarget=1.5 を指定します。


          5. 以下のようなJavaエージェントを作成します。(とりあえず実行対象の文書を無しにすることだけ気をつけていればOKです。)



            エージェント名: GooCalSync Test (任意)

            イベント: アクションメニューから手動で

            対象: なし



            コード: (ServiceException をCatchした以外はほとんど同じです)

            import lotus.domino.;

            import com.google.gdata.client.
            ;

            import com.google.gdata.client.calendar.;

            import com.google.gdata.data.
            ;

            import com.google.gdata.data.acl.;

            import com.google.gdata.data.calendar.
            ;

            import com.google.gdata.data.extensions.;

            import com.google.gdata.util.
            ;

            import java.net.URL;



            public class JavaAgent extends AgentBase {



            public void NotesMain() {


            try {<br/>
                Session session = getSession();<br/>
                AgentContext agentContext = session.getAgentContext();<br/>
            

               // (Your code goes here) <br/>
                CalendarService myService = new CalendarService(&quot;OpenNTF-GooCalSyncTest-0.1&quot;);<br/>
                myService.setUserCredentials(&quot;GooCalSync@gmail.com&quot;, &quot;lotus123&quot;);<br/>
            
            URL postUrl = new URL("http://www.google.com/calendar/feeds/GooCalSync@gmail.com/private/full");
                EventEntry myEntry = new EventEntry();<br/>
            

                myEntry.setTitle(new PlainTextConstruct(&quot;Tennis with Beth&quot;));<br/>
                myEntry.setContent(new PlainTextConstruct(&quot;Meet for a quick lesson.&quot;));<br/>
            

                com.google.gdata.data.DateTime startTime = com.google.gdata.data.DateTime.parseDateTime(&quot;2009-05-17T15:00:00-08:00&quot;);<br/>
                com.google.gdata.data.DateTime endTime = com.google.gdata.data.DateTime.parseDateTime(&quot;2009-05-17T17:00:00-08:00&quot;);<br/>
            

                When eventTimes = new When();<br/>
                eventTimes.setStartTime(startTime);<br/>
                eventTimes.setEndTime(endTime);<br/>
                myEntry.addTime(eventTimes);<br/>
            

                System.out.println(&quot;Posting calendar data....&quot;);<br/>
               // Send the request and receive the response:<br/>
                EventEntry insertedEntry = myService.insert(postUrl, myEntry);<br/>
                System.out.println(&quot;Finished!&quot;);<br/>
            }catch (ServiceException se){<br/>
                System.out.println(&quot;ServiceException is caught by Google Data API &quot;);<br/>
                se.printStackTrace();<br/>
            

            } catch(Exception e) {<br/>
                e.printStackTrace();<br/>
            }<br/>
            
            }

            }





            6. エージェントを保存してNotesクライアントを開きます。



            7. メニューから[ツール]-[Javaデバッグコンソールの表示]を選択します。



            8. エージェントを実行すると以下のException を出して終了しています。



            Posting calendar data….

            ServiceException is caught by Google Data API

            com.google.gdata.util.ServiceException: Invalid redirected-to URL - null

            at com.google.gdata.client.GoogleService.handleRedirectException(GoogleService.java:673)

            at com.google.gdata.client.GoogleService.insert(GoogleService.java:563)

            at JavaAgent.NotesMain(JavaAgent.java:38)

            at lotus.domino.AgentBase.runNotes(Unknown Source)

            at lotus.domino.NotesThread.run(Unknown Source)
          • 同様の問題についてこういう記事があります

            By Toshiaki Nakamura 2 decades ago

            私も同様の方法で試してみたのですが、同じ事象となります。



            検索したところ、ほぼ同じ事象と思われる記事がありました。



            http://code.google.com/p/gdata-issues/issues/detail?id=990



            問題対応したファイルが同サイト上にありましたので、使用してみたのですが、

            ヌルポインタのエラーを出してしまいます。

            また、時間のある時点で確認してみます。

          • 問題はノーツかCalendarServiceか。

            By Muneyuki Ohkawa 2 decades ago

            handleRedirectExceptionの動きがおかしい以前に、insertメソッドを実行するときに、何らかの事象が発生し

            てhandleRedirectExceptionを実行しようとする事自体がおかしいように思います。insertメソッドを実行すると

            HTTP302が返ってきてリダイレクトするみたいなので、リダイレクトに対する実装系の動作に問題があるのか

            な。



            NAT33さん、このコード、ノーツのJVMじゃなくて、ネイティブのJVMならうまくいくんですよね?

            リダイレクト絡みだとしたら、セキュリティ的な制御がノーツ側で働いてしまっているのかな。

            Androidでの問題も、同じことかも。まだわからないけど。

            • ネイティブのJVMではまだ確認してないのですが

              By Toshiaki Nakamura 2 decades ago

              申し訳ないです。実はネイティブでの動作は未確認です。



              一応、APIのドキュメントにあるコードをほとんどそのまま使ってはいるのですが、念の為にネイティブでの動作確認が必要かもしれません。



              明日であれば時間が取れますので、その時にでもネイティブのJVMで確認してみます。

              • 確認しました

                By Toshiaki Nakamura 2 decades ago

                NAT33です。



                あまりきれいではないのですが、以下のコードで確認しました。



                import com.google.gdata.client.;

                import com.google.gdata.client.calendar.
                ;

                import com.google.gdata.data.;

                import com.google.gdata.data.acl.
                ;

                import com.google.gdata.data.calendar.;

                import com.google.gdata.data.extensions.
                ;

                import com.google.gdata.util.;

                import java.net.URL;

                import java.io.
                ;



                class test {



                public static void main(String args[]) {

                try {<br/>
                    CalendarService myService = new CalendarService(&quot;OpenNTF-GooCalSyncTest-1&quot;);<br/>
                    myService.setUserCredentials(&quot;GooCalSync@gmail.com&quot;, &quot;lotus123&quot;);<br/>
                    try {<br/>
                

                URL postUrl = new URL("http://www.google.com/calendar/feeds/GooCalSync@gmail.com/private/full");

                        CalendarEventEntry myEntry = new CalendarEventEntry();<br/>
                        myEntry.setTitle(new PlainTextConstruct(&quot;Tennis with Beth&quot;));<br/>
                        myEntry.setContent(new PlainTextConstruct(&quot;Meet for a quick lesson.&quot;));<br/>
                


                        DateTime startTime = DateTime.parseDateTime(&quot;2009-04-17T15:00:00-08:00&quot;);<br/>
                        DateTime endTime = DateTime.parseDateTime(&quot;2009-04-17T17:00:00-08:00&quot;);<br/>
                        When eventTimes = new When();<br/>
                        eventTimes.setStartTime(startTime);<br/>
                        eventTimes.setEndTime(endTime);<br/>
                        myEntry.addTime(eventTimes);<br/>
                        try {<br/>
                           // Send the request and receive the response:<br/>
                            CalendarEventEntry insertedEntry = myService.insert(postUrl, myEntry);<br/>
                        }catch (ServiceException e){<br/>
                            System.out.println(&quot;ServiceException is caught by Google Data API &quot;);<br/>
                            e.printStackTrace();<br/>
                        }<br/>
                    }catch (IOException e){<br/>
                        System.out.println(&quot;ServiceException is caught by Google Data API &quot;);<br/>
                        e.printStackTrace();<br/>
                    }<br/>
                }catch (AuthenticationException e){<br/>
                    System.out.println(&quot;ServiceException is caught by Google Data API &quot;);<br/>
                    e.printStackTrace();<br/>
                }<br/>
                


                }<br/>
                

                }



                Eclipseにて、上記のコードをRunしたところ、カレンダー上にイベントが作成されました。

                ですが、同コードを、Javaエージェントとして動かすと、やはり同じ事象となるようです。



                やはり、NotesのJVMの問題なのでしょうか?

                • 検証ありがとうございました。

                  By Muneyuki Ohkawa 2 decades ago

                  JVMの違いが、動作の違いを生んでいることは間違いないですね。

                  DesignerのJavaデバッガーを使って、問題判別できるかな。

              • 了解です。

                By Muneyuki Ohkawa 2 decades ago

                お互い忙しい身でなかなか時間が取れないですね。

                僕も金曜の夜から時間が取れるようになるので、問題判別に参加します。

                • Java エージェントで作れました

                  By Hirotaka Nagashima 2 decades ago

                  長島です。

                  とりあえず、Java.policy の問題のようです。

                  以下の行のような設定があるために、RedirectされたURLを受け取れなくなっているようです。


                  // allows anyone to listen on un-privileged ports<br/>
                  permission java.net.SocketPermission &quot;localhost:1024-&quot;, &quot;listen&quot;;<br/>
                  



                  とりあえずテスト目的でJava.policy をこんな感じにして動かしました。実際は上記のSocketPermission でGoogleのアクセスを許可するような指定にしないといけないと思います。



                  grant{

                  permission java.security.AllPermission;

                  };

                  // Notes java code gets all permissions



                  grant codeBase "file:${notes.binary}/*" {

                  permission java.security.AllPermission;<br/>
                  

                  };



                  grant codeBase "file:${notes.binary}/rjext/*" {

                  permission java.security.AllPermission;<br/>
                  

                  };



                  grant codeBase "file:${notes.binary}/xsp/-" {

                  permission java.security.AllPermission;<br/>
                  

                  };

                  • やりましたね。

                    By Muneyuki Ohkawa 2 decades ago

                    長島さん、ありがとうございます!

                    これでなんとか先に進めますね。

                    NotesのJava環境は、セキュリティにかなり配慮されているみたいですね。

                    実際のJava.policyの設定をどうするかは、あとで検討しましょう。



                    NAT33さん他、皆さんの環境でも試してみてください。

                    そして、技術検証の残りの3つを片付けましょうか。

                  • すいません

                    By Toshiaki Nakamura 2 decades ago

                    NAT33です。



                    提示されていた、java.policyの設定で試してみたのですが、同じ事象が起きるようです。



                    他に何か設定を変えた部分はありますでしょうか?



                    現在は、8.5日本語版の試用品で作業を行っています。

                    • お騒がせしました

                      By Toshiaki Nakamura 2 decades ago

                      NAT33です。



                      私の環境ではうまく動作しなかったのは、以下のrjextにあたるディレクトリが存在していない為でした。

                      当方は、8.5日本版の試用版なのですが、同じように環境差による問題が起きると思いますので若干の注意が必要かと思います。



                      grant codeBase "file:${notes.binary}/rjext/*" {

                      permission java.security.AllPermission;

                      };



                      上記部分をコメントアウトしたところ、こちらでも動作することを確認できました。

                      • 同じ現象が発生します。

                        By Tsutomu Sasaki 2 decades ago

                        Sasaki です。



                        遅れていますが、Domino8.5 日本語環境にてコード検証しましたが、

                        以下のエラーが発生します。





                        Posting calendar data….

                        ServiceException is caught by Google Data API

                        com.google.gdata.util.ServiceException: Invalid redirected-to URL - null

                        at com.google.gdata.client.GoogleService.handleRedirectException(GoogleService.java:673)<br/>
                        at com.google.gdata.client.GoogleService.insert(GoogleService.java:563)<br/>
                        at JavaAgent.NotesMain(JavaAgent.java:38)<br/>
                        at lotus.domino.AgentBase.runNotes(Unknown Source)<br/>
                        at lotus.domino.NotesThread.run(Unknown Source)<br/>
                        





                        エラーメッセージから判断すると、同じ状況なので java.policy に問題があるのかと想像していますが、

                        以下のように設定しているのですが、状況が改善しません。

                        私の環境だけなのでしょうか・・・



                        java.policy は以下のように設定しています。

                        調査していましたが、解決の糸口が見つからずに困っています。

                        何か他に関係する箇所はあるのでしょうか?



                        grant{

                        permission java.security.AllPermission;

                        };

                        // Notes java code gets all permissions



                        grant codeBase "file:${notes.binary}/" {

                        permission java.security.AllPermission;

                        };



                        grant codeBase "file:${notes.binary}/xsp/
                        " {

                        permission java.security.AllPermission;

                        };

                        • リブートで直らないでしょうか。

                          By Muneyuki Ohkawa 2 decades ago

                          私も最近、やっとコードの稼動確認を行いましたが、java.policyを設定しているにもかかわらず、この現象が出ていました。しかし、PCをリブートしたり、Notesクライアントをリブートしているうちに、ちゃんと動くようになりました。なにが決めてだったのかわかりません。



                          この現象は、ほかの人にも出るでしょうから、どういう風にして直るのか、ちょっと見ておいていただけますか?

                          • 途中経過

                            By Tsutomu Sasaki 2 decades ago

                            Sasaki です。



                            ご回答頂きありがとうございます。

                            ご指摘のあったところについては、試してみましたが状況は改善していません。

                            とりあえず対応したものについて報告します。



                            1) ライブラリの配置場所



                            ライブラリは、{Notesホームディレクトリ}\jvm\lib\ext に「gdata*」を置いています。

                            これらのライブラリを削除したら別のエラーメッセージが出力されるようになったので、

                            配置場所としては特に問題ないのかなと思います。





                            Exception in thread "Launcher: JavaAgent" java.lang.NoClassDefFoundError: com.google.gdata.data.TextConstruct

                            at java.lang.J9VMInternals.verifyImpl(Native Method)<br/>
                            at java.lang.J9VMInternals.verify(J9VMInternals.java:72)<br/>
                            at java.lang.J9VMInternals.initialize(J9VMInternals.java:134)<br/>
                            at java.lang.Class.newInstanceImpl(Native Method)<br/>
                            at java.lang.Class.newInstance(Class.java:1316)<br/>
                            at lotus.domino.AgentInfo.newInstance(Unknown Source)<br/>
                            at lotus.domino.AgentLauncher.run(Unknown Source)<br/>
                            at lotus.domino.NotesThread.run(Unknown Source)<br/>
                            

                            Caused by: java.lang.ClassNotFoundException: com.google.gdata.data.TextConstruct

                            at lotus.domino.AgentLoader.loadClass(Unknown Source)<br/>
                            at java.lang.ClassLoader.loadClass(ClassLoader.java:609)<br/>
                            ... 8 more<br/>
                            





                            2) java.policy



                            java.policyは下記のように修正しましたが、エラーメッセージに違いはありませんでした。

                            以下の2ファイルとも同じ内容にしています。



                            {Notesホームディレクトリ}\jvm5\lib\security\java.policy

                            {Notesホームディレクトリ}\jvm\lib\security\java.policy





                            grant{

                            permission java.security.AllPermission;

                            };





                            3) リブート



                            リブートは実施していますが、改善しませんでした。





                            この件についてはもう少し調査をしたいと思います。

                            状況が改善したら、またご報告します。

                            • Sasakiさん、ご報告ありがとうございます。

                              By Muneyuki Ohkawa 2 decades ago

                              この問題は、根が深いと思っています。

                              最終的には解決させて、Notes DB Onlyでの実装にしたいのですが、今の時点ではファーストバージョンを早く出すことを優先させたいです。なので、この問題を追っかけるのにワークロードをかけるのは止めて、Javaアプリケーションでの実装に力を注ぎませんか。

                              • 了解しました。

                                By Tsutomu Sasaki 2 decades ago

                                Sasaki です。



                                この問題は一時保留として、Javaアプリケーションとして実装を進めてみます。

                                皆さん、お騒がせしました。



                                2以降の実装に早く進んで、追いつきたいと思います。

                        • 今実行してみたら同じエラーが出ました。

                          By Muneyuki Ohkawa 2 decades ago

                          なんでだろう?

                          皆さんは、Nakamuraさん、Teradaさん、Nagashimaさんは、実行できていますか?



                          別件で、Googleカレンダーへのプログラムアクセスが認証の部分で最近失敗するようになったという話がありました。Google側の認証インターフェースが変わったのでは?という想像がされていますが、それの影響?

                          • 今朝発生しました。

                            By Junya Terada 2 decades ago

                            今朝同じ現象がおきたのですが、Java.Policyをちょっといじって、Notesの再起動で直ってしまいました。



                            ちなみに、私のJava.Policyは



                            NotesのVersionは、

                             IBM Lotus Notes 8



                             リリース 8.0.2

                             リビジョン 20080809.0430 (Release 8.0.2)



                            C:\Notes8\jvm\lib\security\java.policyで



                            内容は

                            //

                            // @(#)src/security/sov/config/java.policy, security, asdev, 20071004 1.5

                            // ===========================================================================

                            // Licensed Materials - Property of IBM

                            // "Restricted Materials of IBM"

                            //

                            // IBM SDK, Java(tm) 2 Technology Edition, v5.0

                            // © Copyright IBM Corp. 1998, 2005. All Rights Reserved

                            // ===========================================================================

                            //





                            // Standard extensions get all permissions by default



                            grant codeBase "file:${java.home}/lib/ext/*" {

                            permission java.security.AllPermission;<br/>
                            

                            };



                            // default permissions granted to all domains



                            grant {

                            // Allows any thread to stop itself using the java.lang.Thread.stop()<br/>
                            // method that takes no argument.<br/>
                            // Note that this permission is granted by default only to remain<br/>
                            // backwards compatible.<br/>
                            // It is strongly recommended that you either remove this permission<br/>
                            // from this policy file or further restrict it to code sources<br/>
                            // that you specify, because Thread.stop() is potentially unsafe.<br/>
                            

                            // See "http://java.sun.com/notes" for more information.

                            permission java.lang.RuntimePermission &quot;stopThread&quot;;<br/>
                            


                            // allows anyone to listen on un-privileged ports<br/>
                            permission java.net.SocketPermission &quot;localhost:1024-&quot;, &quot;listen&quot;;<br/>
                            

                            // permission java.net.SocketPermission "localhost:0-", "listen";


                            // &quot;standard&quot; properies that can be read by anyone<br/>
                            


                            permission java.util.PropertyPermission &quot;java.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vendor&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vendor.url&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.class.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;os.name&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;os.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;os.arch&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;file.separator&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;path.separator&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;line.separator&quot;, &quot;read&quot;;<br/>
                            


                            permission java.util.PropertyPermission &quot;java.specification.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.specification.vendor&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.specification.name&quot;, &quot;read&quot;;<br/>
                            


                            permission java.util.PropertyPermission &quot;java.vm.specification.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vm.specification.vendor&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vm.specification.name&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vm.version&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vm.vendor&quot;, &quot;read&quot;;<br/>
                            permission java.util.PropertyPermission &quot;java.vm.name&quot;, &quot;read&quot;;<br/>
                            


                            permission java.net.NetPermission &quot;getCookieHandler&quot; ;<br/>
                            permission java.net.NetPermission &quot;setCookieHandler&quot; ;<br/>
                            



                            };



                            // Notes java code gets all permissions



                            grant codeBase "file:${notes.binary}/*" {

                            permission java.security.AllPermission;<br/>
                            

                            };



                            grant codeBase "file:${notes.binary}/rjext/*" {

                            permission java.security.AllPermission;<br/>
                            

                            };

                            • 寺田さんのところでも発生しているのですね。

                              By Muneyuki Ohkawa 2 decades ago

                              Notesの再起動で直るのは僕の環境でもそうなのですが、再起動では直らないこともしばしばです。

                              対応策を講じるのであれば、発生メカニズムを特定する必要があります。

                              そのためには、Googleライブラリーのトレースが必要ですが、以下の理由であきらめて、まずはJavaアプリケーションでの実装でファーストバージョンを出したいと思います。



                               ・Googleライブラリーの分析にはワークロードがかかりすぎる。

                               ・redirectの問題が解決したとしても、他にNotes JVM上での動作の違いが出てくる可能性がある。

                        • ライブラリのおき場所ではないでしょうか

                          By Hirotaka Nagashima 2 decades ago

                           長島です。



                          私も8.5日本語版環境で検証しているので、Java.policyの内容も同じだとしたらライブラリの置き場所ではないかと思います。



                          私の場合は以下に検証手順を記載していますが、ライブラリをJavaUserClasses ではなく、直接extディレクトリにコピーしてしまっています。

                          http://www.openntf.org/Projects/pmt.nsf/b521bae9087a360985256bed004b4ec4/5c0ba388a8e7e3a4862575910018bec3!OpenDocument



                          どうしてもうまくいかないのであればJava.policyはバックアップを取って以下の内容だけにしてみてトライしてみてもいいのかもしれません。



                          // Standard extensions get all permissions by default

                          grant{

                          permission java.security.AllPermission;

                          };



                          ただ、今の時点ではとにかくJava.policyの設定を下げるだけ下げて動かす、と言うことをしていますが、仕様面では以下の議論が必要なのではないかと思います。



                          ・ 適切な設定の確認

                          ・ 標準導入手順の確定

                          ・ アプリケーションの形態(単独NSFなのかメールテンプレートの拡張なのか単独Javaアプリケーションとして出すのか)



                          ただ、これだけ失敗するのであればひょっとしたら単独Javaアプリケーションとして開発するほうがよいのかもしれません。


                          Notesの技術者がこれだけ集まって・・・というのはもちろんありますが。。。

                  • ありがとうございます。

                    By Junya Terada 2 decades ago

                    長島さん

                    ありがとうございます。



                    無事動作できました。(諸事情により、Notes8.5で動かしました。)

    • 2を行うにあたり

      By Toshiaki Nakamura 2 decades ago

      2について、以下のように考えられます。



      Notes側の文書を削除した場合

      ・検索の方向は、Googleカレンダー → Notes DB となると思われる。

      ・Notes DB上に文書が見つからない場合、Googleカレンダー上のイベントを削除する。



      Googleカレンダー側の文書を削除した場合

      ・検索の方向は、Notes DB → Googleカレンダー となると思われる。

      ・Googleカレンダー上に文書が見つからない場合、Notes DB上のイベントを削除する。



      したがって、削除にあたり、文書もしくはイベントの検索用キーは、UNIDではなく、双方で同じ値を保持できるものである必要があるのでは?



      おそらく、イベント追加についても、同様のキーで行けると思います。



      まずは、削除を行えるかどうかの確認だとは思いますが。

      これについても、ネイティブのJVMで確認したうえで、Notes上に持っていこうと思います。

      • 簡単な検索と削除処理を試しました

        By Toshiaki Nakamura 2 decades ago

        簡単なイベントの検索と削除を以下のルーチンで試しました。

        8.5で確認したところ、動作するようです。



        尚、削除対象のイベントは、"Tennis"の文字列を含むものを削除するようにしてあります。



        import lotus.domino.;

        import com.google.gdata.client.
        ;

        import com.google.gdata.client.calendar.;

        import com.google.gdata.data.
        ;

        import com.google.gdata.data.acl.;

        import com.google.gdata.data.calendar.
        ;

        import com.google.gdata.data.extensions.;

        import com.google.gdata.util.
        ;

        import java.net.URL;



        public class JavaAgent extends AgentBase {


        public void NotesMain() {<br/>
        


            try {<br/>
                Session session = getSession();<br/>
                AgentContext agentContext = session.getAgentContext();<br/>
        


               // (Your code goes here) <br/>
        



        CalendarService myService = new CalendarService("OpenNTF-GooCalSyncTest-1");

        myService.setUserCredentials("GooCalSync@gmail.com", "lotus123");



        URL feedUrl = new URL("http://www.google.com/calendar/feeds/GooCalSync@gmail.com/private/full");

        Query myQuery = new Query(feedUrl);

        myQuery.setFullTextQuery("Tennis");

        CalendarEventFeed myResultsFeed = myService.query(myQuery,

        CalendarEventFeed.class);<br/>
        

        if (myResultsFeed.getEntries().size() > 0) {

        CalendarEventEntry firstMatchEntry = (CalendarEventEntry)

          myResultsFeed.getEntries().get(0); <br/>
        

        firstMatchEntry.delete();

        }


            } catch(Exception e) {<br/>
                e.printStackTrace();<br/>
            }<br/>
        }<br/>
        

        }



        ちなみに、APIの実装例ではエラーするようです。最新版の1.3ではまだ該当事象のFixが採用されていないようなので、

        (次期バージョンで採用されるようです)実装例とは削除方法を変えてあります。

        • 2番完了!

          By Muneyuki Ohkawa 2 decades ago

          Nakamuraさん、ありがとうございました。

          技術検証レベルでは、削除はこれでOKですね。



          検索は、検索用キーをどうするかが決まってから3番の更新の検証を行う中で実施することになりますね。

    • 3のまえに4かなと

      By Junya Terada 2 decades ago

      4のコードを少々乱暴ですが、作ってみました。(ほぼサンプルコードを流用しています。)



      まだタイトル部分しかとってこないので、取得項目を決めてから取得項目を増やす形が良いかなと



      インデントとかむちゃくちゃで申し訳ございません。



      import com.google.gdata.client.;

      import com.google.gdata.client.calendar.
      ;

      import com.google.gdata.data.;

      import com.google.gdata.data.acl.
      ;

      import com.google.gdata.data.calendar.;

      import com.google.gdata.data.extensions.
      ;

      import com.google.gdata.util.;

      import java.net.URL;

      import java.io.
      ;

      import java.net.MalformedURLException;



      class test2 {

      <br/>
      



      public static void main(String args[]) {

      System.out.println("Start test");

      try {

      CalendarService myService = new CalendarService("OpenNTF-GooCalSyncTest-1");

      myService.setUserCredentials("GooCalSync@gmail.com", "lotus123");

      try {

      // Send the request and receive the response:



      printAllEvents(myService);



      }catch (ServiceException e){

      System.out.println("ServiceException is caught by Google Data API ");

      e.printStackTrace();

      }catch (IOException e){

      System.out.println("ServiceException is caught by Google Data API ");

      e.printStackTrace();

      }

      }catch (AuthenticationException e){

      System.out.println("ServiceException is caught by Google Data API ");

      e.printStackTrace();

      }



      }

      private static void printAllEvents(CalendarService service) throws ServiceException, IOException {

      // Send the request and receive the response:<br/>
      URL eventFeedUrl =null;<br/>
         try {<br/>
      

      eventFeedUrl = new URL("http://www.google.com/calendar/feeds/GooCalSync@gmail.com/private/full");

      } catch (MalformedURLException e) {<br/>
       // Bad URL<br/>
        System.err.println(&quot;Uh oh - you've got an invalid URL.&quot;);<br/>
        e.printStackTrace();<br/>
      }<br/>
      <br/>
      CalendarEventFeed resultFeed = (CalendarEventFeed)service.getFeed(eventFeedUrl, CalendarEventFeed.class);<br/>
      System.out.println(&quot;All events on your calendar:&quot;);<br/>
      System.out.println();<br/>
      for (int i = 0; i &lt; resultFeed.getEntries().size(); i++) {<br/>
        CalendarEventEntry entry = (CalendarEventEntry)resultFeed.getEntries().get(i);<br/>
        System.out.println(&quot;\t&quot; + entry.getTitle().getPlainText());<br/>
      }<br/>
      System.out.println(); <br/>
      

      }

      }

      • 4番は完了!

        By Muneyuki Ohkawa 2 decades ago

        技術検証レベルでは、これでOKだと思います。ありがとうございました。

        さすが、Java職人。

        よくわからないけど、コードを見ると、なんか手馴れた感じがします。

    • 検索用キーと利用クラスの検討

      By Muneyuki Ohkawa 2 decades ago

      Nakamuraさんがおっしゃられているように、GoogleカレンダーエントリとNotesカレンダーエントリを一対一で対応付けるキーが必要です。iCalendarの仕様を確認すると、UIDという項目があります。これは、ユニバーサルでユニークになるように考えられたものであり、例えば、"dkobuasdfasdhloiwehf@goocalsync.com" のように、ドメイン名と、そのドメイン内でユニークなキー値で構成される文字列になります。Googleカレンダー上に作成されたエントリーをエクスポートしてみると、確かに、UIDがあります。@の左側は、作成日時から生成されているっぽいです。NotesのレプリカIDと同じですね。



      このUIDを検索用キーとして使うのが適切だと思うのですが、皆さん、どう思われますか?



      そうすると、Notesカレンダ文書上にUIDを格納するフィールドを追加する必要があります。Google上でエントリーを作成すれば自動的にUIDはアサインされます。Notes上で作成されたものに対しては、同期処理の時に、GooCalSync内で採番して、そのUIDでGoogle上のエントリを作成するということになります。



      UIDを扱うには、カレンダーエントリーを表すクラスには、CalendarEventEntryクラスを使うことになりそうです。サンプルで使われているEventEntryクラスでは、機能が足りません。