適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

JavaでNotesカレンダーの情報を取得する

Notesを外部から操作したい

IBM Notesをグループウェアとして使っております。そこで管理しているスケジュールをGoogleカレンダーと同期するため、Notesカレンダーから予定を取得するプログラムを作りました。取得したデータをGoogleカレンダーに書き込みます。最近は下火のNotesですが、誰かの参考になることを願って。。。

Googleカレンダーと同期するところは別の記事で書きたいと思います。

Notesへアクセスするための事前準備

 NotesにはJavaのAPIが準備されています。他にもCOMオブジェクトもあるので、VBAなどからも操作することができます。

Notesへアクセスするためには、大前提として、NotesクライアントかNotesサーバーがインストールされている必要があります。Javaで操作するには、Lotus Notesから提供されているNotes.jarのライブラリを使います。Notesがインストールされている環境であれば、インストールディレクトリのどこかに存在するかと思います。

実行する際は、同じくLotus Notesから提供されるJREを使います。私の環境だと、「C:\Program Files (x86)\Java」の中にあるJavaを使っています。また、Notes.jar内部で参照しているnlsxbe.dllというライブラリを読み込めるようにするために、環境変数PATHにnlsxbe.dllの存在するディレクトリを設定する必要があります。

参考サイト 64bit OS環境下で 32bit ノーツのJavaライブラリを使う (プログラマーですが、何か?(I am a software programmer.))

実装

NotesManagerクラスという名前で実装してみます。loadFromNotesCalenderというメソッドでカレンダーの内容をList形式で返すというものです。Listの要素はScheduleという、カレンダーのひとつの予定を表すクラスです。

環境によって可変となる値はプロパティファイルを作ってコードの外に逃がしています。

Notes.properties

Server=Notesサーバーのパス
Database=メールDBのパス(○○.nsf)
Password=Notesのパスワード

NotesManagerクラス

//NotesManager.java

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;

import lotus.domino.Database;
import lotus.domino.DateTime;
import lotus.domino.Document;
import lotus.domino.NotesCalendar;
import lotus.domino.NotesCalendarEntry;
import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;;

public class NotesManager {
    private static Properties properties;
    private static final String FILE_PATH="Notes.properties";

    public NotesManager() throws IOException {
        InputStream in =NotesManager.class.getClassLoader().getResourceAsStream(FILE_PATH);
        properties=new Properties();
        properties.load(in);
    }

    public ArrayList<Schedule> loadFromNotesCalender(){
        //スレッドの開始
        NotesThread.sinitThread();
        Session session;
        Database db;
        ArrayList<Schedule> list=new ArrayList<Schedule>();

        //Sessionの開始
        try {
            session = NotesFactory.createSession((String)null,(String)null,properties.getProperty("Password"));
            db = session.getDatabase(properties.getProperty("Server"), properties.getProperty("Database"));

            //カレンダーのデータを取得
            NotesCalendar nc=session.getCalendar(db);
            DateTime start = session.createDateTime((new Date()));
            Calendar c=Calendar.getInstance();
            c.setTime(new Date());
            SimpleDateFormat sdf=new SimpleDateFormat();
            c.add(Calendar.YEAR, 1);
            DateTime end = session.createDateTime(sdf.format(c.getTime()));
            DateTimeFormatter dtf=new DateTimeFormatterBuilder().toFormatter();
            Vector<NotesCalendarEntry> entries=nc.getEntries(start,end);

            //カレンダーから開始・終了日時と題名を取得する
            for(int i=0;i<entries.size();i++) {
                NotesCalendarEntry cale=entries.elementAt(i);
                Document doc =cale.getAsDocument();
                Schedule schedule=new Schedule(doc);
                list.add(schedule);
            }
            System.out.println("Notesカレンダーからの取得数:"+entries.size());
        } catch (NotesException e) {
            e.printStackTrace();
        }finally {
            NotesThread.stermThread();
        }
        return list;
    }
}

Notesの予定をカプセル化するクラス

//Schedule.java

import java.util.Calendar;
import lotus.domino.DateTime;
import lotus.domino.Document;
import lotus.domino.NotesException;

public class Schedule {
    private Calendar start;
    private Calendar end;
    private String subject;
    private String location;
    private boolean allDay;

    public Schedule(Document doc) throws NotesException {
        Calendar startDate=Calendar.getInstance();
        startDate.setTime(((DateTime) doc.getItemValueDateTimeArray("StartDateTime").firstElement()).toJavaDate());
        Calendar endDate=Calendar.getInstance();
        endDate.setTime(((DateTime) doc.getItemValueDateTimeArray("EndDateTime").firstElement()).toJavaDate());
        String subject=doc.getItemValueString("Subject");
        String location=doc.getItemValueString("Location");
        this.start = startDate;
        this.end = endDate;
        this.subject = subject;
        this.location = location;
        //全日のいい判定が見つからずアイコンで判定
        if(doc.getItemValueString("$IconSwitcher").equals("AllDayEvent")) {
            allDay=true;
        }else {
            allDay=false;
        }
    }
    public Calendar getStart() {
        return start;
    }
    public Calendar getEnd() {
        return end;
    }
    public String getSubject() {
        return subject;
    }
    public String getLocation() {
        return location;
    }
    public boolean isAllDay() {
        return allDay;
    }
    @Override
    public String toString() {
        return "Schedule [start=" + start + ", end=" + end + ", subject=" + subject + ", location=" + location
                + ", allDay=" + allDay + "]";
    }
}