• GooCalSyncの実装

    By Muneyuki Ohkawa 2 decades ago

    1つのNSFで実装して、それをローカルドライブに置いて利用することを考えていますが、いかがでしょうか。DBを開くと、設定パラメータや同期開始ボタンが表示されているページが現れるイメージです。



    Google Calendar Data API の jarファイルは、できれば、NSFの中に格納させておき、クラスパスの設定やjarのインストールの手間をかけないようにしたいと思います。



    java.policyの設定変更は、最終的にはGooCalSync内で、自動的に編集させたいです。

    • 気になった点

      By Hirotaka Nagashima 2 decades ago

      長島です。

       私も単独NSFをずっとイメージしていましたが、いくつか不安な点が出てきたような気がするので一応コメントしておきます。



      ・ JarファイルをNSFに置いておく点について

       Notesカレンダー、Google Data API、独自ライブラリなどのJarファイルを置く事になりますが、JarファイルをNSFに置く提供形態はメモリーリークが懸念されます。 (SPR ICOR66LLY4)

      http://www.ibm.com/support/docview.wss?rs=899&uid=swg21202732



      繰り返し実行が想定される点・Google Data APIの関連Jarファイルが30個近くある点等を考慮してもこの方法は推奨しません。extディレクトリからの実行を試していたのもこの問題が背景にあります。



      まあローカルなのでそんなにぴりぴりしないでも・・・とは思うのですが。





      ・ Java.policy の混乱

       現時点ではほとんどの人がJava.policy関連の問題でつまづいているのでここの自動化は難航が予想されると思います。



       - そもそも動いた設定もセキュリティを下げすぎなので適切な設定にする必要がある

        (最終的にはアクセスするライブラリをホストレベルで許可しただけで動くようにしないといけない。)

       - 同じ設定にしたと思われてもよく分からない理由で失敗していたケースが報告されており、適切な設定・導入方法は慎重に検討している必要がある

       - お客様がこのファイルを編集している場合の対応や衝突

        (現時点ではこのような環境は自動では出来ない、と言う結論になるとは思いますが。)



      なので、ここは少なくとも初期バージョンではドロップしてもいい気がしています。

      • NSFかJavaアプリか。

        By Muneyuki Ohkawa 2 decades ago

        長島さん、コメントありがとうございます。



        "Invalid redirected-to URL - null" のエラーは、私の環境では相変わらず出ています。でも、忘れたころに直ってちゃんと動作する時があります。そこで、問題判別しようとして、java.policyの設定を変更すると、またエラーになって、いろいろしているうちにまた動くようになって・・・。java.policyをまったくいじっていないくても、動いたり動かなかったりします。このエラーは、Googleのライブラリーが出しているので、Googleのライブラリー含めてNotesのJVM上でデバッグすれば、問題判別できそうな気はします。感覚的にはですが、このエラーは、java.policyの問題というよりも、別の何かが原因、もしくはjava.policyと複合要因で発生しているように思います。GoogleライブラリーとNotes JVMの相性の問題と簡単に片付けたくはないですが、Googleライブラリーは、枯れた技術のようですし、通常のJVMでの稼動は問題ないのでしょう。そうすると、GooCalSyncの実装方法もNSF以外、つまりJavaアプリでの実装を検討に入れたほうがよさそうです。



        Javaアプリにした場合のメリットは、以下でしょうか。

         メリット1.稼動の安定性が見込める。

         メリット2.java.policyの設定変更が必要ない。

         メリット3.Notes 6.5や7.0でも稼動する。

         メリット4.開発・デバッグ環境が充実する。

        逆にデメリットとしては、以下。

         デメリット1.バージョン1.5以上のJRM/JVMの導入が必要。



        なるべく導入・設定が簡単なようにと思い、NSFでの実装をイメージしていましたが、上記のように考えると、Javaアプリの実装にしましょうか。

        • 互換性の話なのですが

          By Toshiaki Nakamura 2 decades ago

          "Invalid redirected-to URL - null" のエラーは当方でも頻発していますので、基本的には賛同です。



          ただ、少し気になった点があります。



          Javaから直接、NotesDBにアクセスすることになると思うのですが、その場合に使用するNotes.javaは、6.5もしくは7.0でも、1.5形式でコンパイルした場合に使用できるのでしょうか?



          GoogleのAPIは、1.5以上が前提なので、そこが気になります。



          あとは、UIの実装の話になってしまうのですが。

          JavaでGUIも含めて一通り行うのか、Sync部分のみ、Javaアプリ化しておいて残りはNotesDBとして実装するのか?

          NotesDBへのローカルアクセスは出来ると思うので、設定部分のみ、NotesDBとすることも可能ではあります。

          • JDKとNotes.jarの互換性

            By Muneyuki Ohkawa 2 decades ago

            JavaからNotesへアクセスするには、notes.jarを使用しますが、各バージョンのNotesで提供されるnotes.jarがサポートするJDKバージョンは、以下に公開されているとおりです。



            http://www.ibm.com/support/docview.wss?rs=899&uid=swg21188789



            従って、サポートの有無という観点では、Notes6.5や7.0が提供するnotes.jarは、JDK1.5ではサポートされません。技術的にも、notes.jarの内部では、一部、下位バージョンのJVMには含まれていないコードを利用しているようです。回避策として、Notes 8が提供するnotes.jarでNotes6.5や7にアクセスするというのが考えられますが、このプロジェクトでNotes 8用のnotes.jarを配布するのはNGです。notes.jarは、製品の一部であるからです。



            ただ、世の中では、上位JDKバージョンで稼動させているお客様はいらっしゃるようです。多分、ほとんどのケースでは問題なく動くのでしょう。もちろん、この場合は、お客様自身がリスクを取っています。



            このプロジェクトでも、スタンスとしては同じでいいと思います。つまり、システム前提条件としては、Notes 8.0以上としておくのだけれど、Notes 6.5, 7.0でも動く可能性はありますという言い方です。今後、Notes 6.5, 7.0上でGooCalSyncのバグ報告があった場合、Notes 8.0上でも再現できれば修正を検討するし、再現できなければ、JDKバージョンとの互換性の問題の可能性があるので、修正しないということです。そういう非互換情報は、GooCalSyncのReadmeなどに入れられたらいいですね。

          • UIの実装

            By Muneyuki Ohkawa 2 decades ago

            Notes開発者の集まりですので、保有スキルの問題から、Notesで出来るところはNotesで実装したいです。



            UIをNotesで組む場合、Nakamuraさんおっしゃるように、Notes文書上の設定値を読み込むのは問題なさそうです。



            処理結果を表示させる部分が少し問題かなと思っています。Notes Javaクラスでは、UI系のクラスが提供されていないからです。プログレスバーなどは実装できそうもありません。処理結果を文書として残す程度ならできそうですね。Notesクライアント画面の下のメッセージ行には、文字列を表示させることくらいはできるかもしれません。



            あとは、NotesからJavaをコールして、外部JVM上で動作させることができるかですね。



            以下を動作検証してから決めましょうか。



             1.NotesからJavaをコールして、外部JVM上で動作させることができるか。

             2.Notesクライアント画面の下のメッセージ行には、Javaから文字列を表示可能か。

            • 少々強引ですが

              By Junya Terada 2 decades ago

              Java1.5とNotes 8からEclipseベースになっている利点を利用してプログレスバーや、メッセージ表示くらいであれば可能です。



              定期実行用のAgentと、ボタンを押して動くAgentでメッセージを出すかどうか分けないとですね。

              ※1時間に1回メッセージが出てるのも・・・・





              import lotus.domino.;



              import org.eclipse.swt.widgets.
              ;

              import org.eclipse.swt.SWT;

              import org.eclipse.swt.layout.;

              import org.eclipse.swt.events.
              ;

              import org.eclipse.swt.graphics.*;



              public class JavaAgent extends AgentBase {


              public void NotesMain() {<br/>
              


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



              // (Your code goes here)



              Display display = new Display();

              Shell shell = new Shell(display);



              //ウィンドウのタイトルを指定

              shell.setText("ProgressBarTest");



              ProgressBar pbar = new ProgressBar(shell,SWT.HORIZONTAL | SWT.SMOOTH);

              pbar.setBounds(10,10,160,20);

              pbar.setMinimum(0);

              pbar.setMaximum(100);

              shell.setBounds(100,100,200,80);



              //イベントループ

              shell.open();

              for(int i = 0; i <=100; i++) {

              Thread.sleep(10);

              pbar.setSelection(i);

              }



              //メッセージボックス

              MessageBox box = new MessageBox(shell, SWT.OK);

              box.setText("MessageBoxTest");

              box.setMessage("MessageBoxTest");

              int ret = box.open();



              //破棄処理

              display.dispose();







              //Your Code ENDS

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

              }

              • おお、プログレスバーが出た!

                By Muneyuki Ohkawa 2 decades ago

                寺田さん、ありがとうございます。

                こんな風にしてやるんですね。



                ちなみに、Agentの定期実行は、クライアントでの実行なので、出来ません。

                ボタンを押して同期するというように、ユーザーが明示的にGooCalSyncを起動させるということを想定しています。

            • 1については、LS2Jでの実装を検証

              By Muneyuki Ohkawa 2 decades ago

              LS2Jは、LotusScriptからJavaのClassを使用する機能です。

              LotusScipt上でJava Classをインスタンス化し、メソッドコールができます。戻り値も取得できます。

              N/D6.0からの機能です。



              これで、Googleライブラリーがうまく動いてくれたら、Notes DBインターフェースで、Sync部分はJavaということができます。



              しかし、なんとなく、NotesのJVM上で動いてしまいそうな気がするな・・・・。そうなると、メインはJavaアプリケーションで、設定値の入力やログの管理だけをNotes DBで実装するというような形になりますね。ユーザーインターフェースがJavaとNotesと2つ出来てしまうことになるけれど、仕方ないか・・・。

              • LS2Jは、Notes JVMで動作

                By Muneyuki Ohkawa 2 decades ago

                以下のコードで検証しましたが、redirectエラーが出てしまいました。

                やっぱりLS2Jは、Notes JVMで動作していますね。当たり前か・・・・。

                とすると、Sync用のJavaコードをキックするには、LotusScriptからShell関数を使って、Shell("java goocalsync", 1)のようにやるのか? しかし、そうすると、Notes以外の外部プロセスから、Notes上で開いているGooCalSync用NSFにアクセスすることになるので、アクセスできるのか?要検証です。



                ■Notes DB側



                Option Public

                Uselsx "*javacon"



                Sub Initialize

                <br/>
                Dim mySession As JavaSession<br/>
                Dim myClass As JavaClass<br/>
                Dim myObject As JavaObject<br/>
                <br/>
                Set mySession = New JAVASESSION()<br/>
                Set myClass = mySession.GetClass(&quot;addcal1&quot;)<br/>
                Set myObject = myClass.CreateObject<br/>
                Call myObject.addcalentry()<br/>
                <br/>
                

                End Sub



                ■Javaアプリケーション側

                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;



                class addcal1 {


                public static void addcalentry(){<br/>
                


                    try {<br/>
                        <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;Test by M.Ohkawa&quot;));<br/>
                        myEntry.setContent(new PlainTextConstruct(&quot;Hello World !!!.&quot;));<br/>
                


                        com.google.gdata.data.DateTime startTime = com.google.gdata.data.DateTime.parseDateTime(&quot;2009-04-18T15:00:00-08:00&quot;);<br/>
                        com.google.gdata.data.DateTime endTime = com.google.gdata.data.DateTime.parseDateTime(&quot;2009-04-18T17:00:00-08:00&quot;);<br/>
                <br/>
                        When eventTimes = new When();<br/>
                        eventTimes.setStartTime(startTime);<br/>
                        eventTimes.setEndTime(endTime);<br/>
                        myEntry.addTime(eventTimes);<br/>
                


                       // Send the request and receive the response:<br/>
                        System.out.println(&quot;Posting calendar data....&quot;);<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/>
                


                }<br/>
                

                }

      • NSFに一票

        By Junya Terada 2 decades ago

        寺田です。



        JavaをメインにやっていながらNSF一票入れます。



        Java.policyの問題は残りますが、NSFをローカルにおくだけですぐに動くようになると良いなと思っていました。

        Javaアプリの場合、人によってJRE(実行環境)のパスが違っていたりして、初期設定が難しくなるかなと・・・



        あと、せっかくOpenNTFなので、NSFかなと思っていました。(笑)

        • 私も最終的にはNSFでの実装に持っていきたいです。

          By Muneyuki Ohkawa 2 decades ago

          NSFを1つコピーするだけで使えるようになるというのは魅力なので、私もNSFでの実装にしたいです。

          しかし、そのためにはjava.policyの問題を完全に片付けなければなりません。そもそも、redirectのエラーは、java.policyが原因ではないかもしれません。私の環境では、java.policyをまったく変えなくても、動いたり動かなかったりします。



          エラーの発生メカニズムの特定には、Googleライブラリーのデバッグが必要であり、ワークロードがかかりすぎます。まずはJavaアプリケーションで実装してファーストバージョンを出すことを目指しませんか。その後、redirectの問題に着手し、Notes DBでの実装を目指すという形にしたいのですが、いかがでしょうか。クライアントのJVM環境の違いによるリスクや導入の難しさの問題は残ってしまうのですが、ガイド等である程度カバーできると考えています。