分散フレームワークChristieを用いたリモートエディタの実装

Takahiro Ikki, Shinji Kono 琉球大学

研究目的, 背景

リモートエディタの概要説明

 MetaGear

テスト用テキストエディタ

 MetaGear

DocumentListenerの記述部分

public class MyDocumentListener implements DocumentListener {
    @Override
    public void insertUpdate(DocumentEvent e) {
        Document doc = e.getDocument();
        loc = e.getOffset();
        System.out.println(loc);

    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        Document doc = e.getDocument();
        sendLoc = e.getOffset();
        System.out.println("delete " + sendLoc);
    }
    @Override
    public void changedUpdate(DocumentEvent e) {
    }
}

コマンドパターンの解説

  package christie.example.RemoteTake;
  import org.msgpack.annotation.Message;

  @Message
  class RTCommand {
      public String line;
      public String cmd;
      public int offset;

      public RTCommand () {}

      public RTCommand(String cmd, String line, int i) {
          this.cmd = cmd;
          this.line = line;
          this.offset = i;
      }

      @Override
      public String toString() {
          return "RTCommand{" +
                  "line='" + line + '\'' +
                  ", cmd='" + cmd + '\'' +
                  ", offset=" + offset +
                  '}';
      }
  }

コマンドパターン実装の際に起こった問題

編集位置の相違

 MetaGear

編集の相違の解消

命令コマンドに番号をつけ相違を解消する

 MetaGear

すれ違いが発生した際の処理

スター型通信

 MetaGear

Christie

Christieのコード例

package christie.example.HelloWorld;

import christie.codegear.CodeGearManager;
import christie.codegear.StartCodeGear;

public class StartHelloWorld extends StartCodeGear {

    public StartHelloWorld(CodeGearManager cgm) {
        super(cgm);
        }

    public static void main(String[] args){
        CodeGearManager cgm = createCGM(10000);
        cgm.setup(new HelloWorldCodeGear());
        cgm.setup(new FinishHelloWorld());
        cgm.getLocalDGM().put("helloWorld","hello");
        cgm.getLocalDGM().put("helloWorld","world");
    }
}
ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000
hello world

DGのアノテーション

package christie.example.HelloWorld;

import christie.annotation.Peek;
import christie.annotation.Take;
import christie.codegear.CodeGear;
import christie.codegear.CodeGearManager;

public class HelloWorldCodeGear extends CodeGear {

    @Take
    String helloWorld;

    @Override
    protected void run(CodeGearManager cgm) {
        System.out.print(helloWorld + " ");
        cgm.setup(new HelloWorldCodeGear());
        cgm.getLocalDGM().put(helloWorld,helloWorld);
    }
}

まとめとこれから