« dialog が開いたら特定の JTextField にフォーカス | トップページ | MasterPanel のキーワード保存 »

2009年10月 1日 (木)

Stand Alone PVT Server

増田内科様のカスタマイズを見ると,PVT Server をサーバ機で走らせるようにされている。自分でも同じことをしたいと思ったのだが,当方のサーバは X をインストールしていない Debian Etch なので,OpenDolphin のクライアントはそのままでは走らない。しかたがないので,console で OpenDolphin の PVT Server 部分だけを起動できるように StandAlonePVTServer を作成した。サーバマシン起動時に起動スクリプトで立ち上げることにして,JBoss サーバが立ち上がるまで 10 秒ごとにログインをリトライするようにした。

 

server/StandAlonePVTServer.java

package open.dolphin.server;

import java.util.Iterator;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.prefs.Preferences;
import open.dolphin.client.ClientContext;
import open.dolphin.client.ClientContextStub;
import open.dolphin.delegater.UserDelegater;
import open.dolphin.infomodel.UserModel;
import open.dolphin.plugin.PluginLoader;
import open.dolphin.project.DolphinPrincipal;
import open.dolphin.project.Project;
import open.dolphin.project.ProjectStub;
import org.apache.log4j.Logger;

/**
 * Console verion of PVT Server
 * @author pns
 */
public class StandAlonePVTServer {
  private static final String DEFAULT_FACILITY_OID = "1.3.6.1.4.1.9414.10.1";
  private final String NODE_NAME = "/open/dolphin/project";
  private PVTServer pvtServer;
  private Logger pvtLogger;
  private ScheduledFuture timerHandler;
  
  private StandAlonePVTServer(String hostIp, String userId, String password) {

    // ClientContext を生成する
    ClientContextStub stub = new ClientContextStub();
    ClientContext.setClientContextStub(stub);

    pvtLogger = ClientContext.getLogger("pvt");

    pvtLogger.info("Host Address: " + hostIp);
    pvtLogger.info("User ID: " + userId);

    // set dolphin server address
    Preferences prefs = Preferences.userRoot().node(NODE_NAME);
    prefs.put(Project.HOST_ADDRESS, hostIp);

    // pref に設定した host address を Project に書き込み
    Project.setProjectStub(new ProjectStub());

    // facility ID と user ID をセット
    DolphinPrincipal principal = new DolphinPrincipal();
    principal.setFacilityId(DEFAULT_FACILITY_OID);
    principal.setUserId(userId);

    // 10秒ごとにログインをトライする
    Login l = new Login(principal, password);
    ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
    timerHandler = schedule.scheduleWithFixedDelay(l, 0, 10, TimeUnit.SECONDS);
  }

  protected class Login implements Runnable {
    private UserDelegater userDlg;
    private UserModel userModel;
    private DolphinPrincipal principal;
    private String password;

    public Login(DolphinPrincipal principal, String password) {
      userDlg = new UserDelegater();
      this.principal = principal;
      this.password = password;
    }

    public void run() {
      userModel = null;
      try {
        userModel = userDlg.login(principal, password);
      } catch (Exception ex) {
        System.out.println(ex);
      }
      if (userModel != null) {
        startPVTServer();
        timerHandler.cancel(true);
        pvtLogger.info("Login process completed");
      } else {
        pvtLogger.info("Login failed. Retry in 10 sec.");
      }
    }
  }

  private void startPVTServer() {

    // plugin loader
    PluginLoader loader = PluginLoader.load(PVTServer.class, ClientContext.getPluginClassLoader());
    Iterator iter = loader.iterator();
    if (iter.hasNext()) {
      pvtServer = iter.next();
      pvtServer.setContext(null);
      pvtServer.start();
    }

    // ^C でサーバを止めるための設定
    Runtime.getRuntime().addShutdownHook(new Thread(){
      @Override
      public void run() {
        pvtLogger.info("Shutdown process starts.");
        pvtServer.stop();
      }
    });
  }

  public static void main(String[] args) {
    String usage = "Usage: java -cp OpenDolphin-1.3.0.X.jar open.dolphin.server.StandAlonePVTServer -Uxxxx -Pxxxx -Sxxx.xxx.xxx.xxx";
    String userId = "";
    String userPassword = "";
    String serverAddress = "";
    for (String arg : args){
      if ("-U".equals(arg.substring(0, 2))){
        userId = arg.substring(2, arg.length());
      }
      if ("-P".equals(arg.substring(0, 2))){
        userPassword = arg.substring(2, arg.length());
      }
      if ("-S".equals(arg.substring(0,2))){
        serverAddress = arg.substring(2, arg.length());
      }
    }
    if (!userId.equals("") && !userPassword.equals("") && !serverAddress.equals("")) {
      new StandAlonePVTServer(serverAddress, userId, userPassword);
    } else {
      System.out.println(usage);
      System.exit(1);
    }
  }
}

起動スクリプト pvtserver.sh

#!/bin/bash

OPENDOLPHIN="OpenDolphin-1.3.0.2.jar"
PVTSERVER="open.dolphin.server.StandAlonePVTServer"
PVTSERVER_HOME="/home/dolphin/opendolphin-client"
PVTSERVER_USER="dolphin"
JBOSS_HOST="192.168.1.100"
JAVA="/usr/bin/java"
USER="admin"
PASS="admin"

SUBIT="su - $PVTSERVER_USER -c "

# log
PVTSERVER_CONSOLE=$PVTSERVER_HOME/log/console.log

if [ -n "$PVTSERVER_CONSOLE" -a ! -d "$PVTSERVER_CONSOLE" ]; then
  # ensure the file exists
  touch $PVTSERVER_CONSOLE
  if [ ! -z "$SUBIT" ]; then
    chown $PVTSERVER_USER $PVTSERVER_CONSOLE
  fi 
fi

if [ -n "$PVTSERVER_CONSOLE" -a ! -f "$PVTSERVER_CONSOLE" ]; then
  echo "WARNING: location for saving console log invalid: $PVTSERVER_CONSOLE"
  echo "WARNING: ignoring it and using /dev/null"
  PVTSERVER_CONSOLE="/dev/null"
fi

# define what will be done with the console log
PVTSERVER_CONSOLE=${PVTSERVER_CONSOLE:-"/dev/null"}

PVTSERVERSH="$JAVA -cp $OPENDOLPHIN $PVTSERVER -U$USER -P$PASS -S$JBOSS_HOST"
PVTSERVER_CMD_START="cd $PVTSERVER_HOME/; $PVTSERVERSH"

if [ ! -d "$PVTSERVER_HOME" ]; then
  echo PVTSERVER_HOME does not exist as a valid directory : $PVTSERVER_HOME
  exit 1
fi

# echo PVTSERVER_CMD_START = $PVTSERVER_CMD_START

function procrunning() {
   procid=0
   PVTSERVERSCRIPT=$(echo $PVTSERVERSH | awk '{print $1}')
   for procid in `/bin/pidof -x "$PVTSERVERSCRIPT"`; do
       ps -fp $procid | grep "${PVTSERVERSH% *}" > /dev/null && pid=$procid
   done
}


stop() {
    pid=0
    procrunning
    if [ $pid = '0' ]; then
        echo -n -e "\n * No PVTServer is currently running\n"
        exit 1
    fi

    RETVAL=1

    # If process is still running
    for id in `ps --pid $pid | awk '{print $1}' | grep -v "^PID$"`; do
       if [ -z "$SUBIT" ]; then
           kill $id
       else
           $SUBIT "kill $id"
       fi
    done

    sleep=0
    while [ $sleep -lt 5 -a $RETVAL -eq 1 ]; do
        echo -n -e "\n * waiting for processes to stop";
        sleep 1
        sleep=`expr $sleep + 10`
        pid=0
        procrunning
        if [ $pid == '0' ]; then
            RETVAL=0
        fi
    done

    # Still not dead... kill it

    count=0
    pid=0
    procrunning

    if [ $RETVAL != 0 ] ; then
        echo -e "\n * Timeout: Shutdown command was sent, but process is still running with PID $pid"
        exit 1
    fi

    echo
    exit 0
}

case "$1" in
start)
    echo " * Starting PVTServer, check $PVTSERVER_CONSOLE"
    cd $PVTSERVER_HOME/
    if [ -z "$SUBIT" ]; then
        eval $PVTSERVER_CMD_START >${PVTSERVER_CONSOLE} 2>&1 &
    else
        $SUBIT "$PVTSERVER_CMD_START >${PVTSERVER_CONSOLE} 2>&1 &" 
    fi
    ;;
stop)
    stop
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart|help)"
esac

« dialog が開いたら特定の JTextField にフォーカス | トップページ | MasterPanel のキーワード保存 »

OpenDolphin」カテゴリの記事