2011年12月21日水曜日

【php】XMLを読み込んで複数のコマンドを実行する

前回のプログラムを少し拡張してみた。XMLをロードして複数コマンドを実行する。

001<?php
002doMultiProcesses($argc , $argv);
003//コマンド
004function doMultiProcesses($num,$param){
005    if($num  < 2){
006        echo "コマンドが入力されていません。\n";
007        return;
008    }
009    execProcess($param);
010 }
011 
012//コマンドの実行
013function execProcess($arg)
014{
015    switch($arg[1]){
016    case "xml":
017        if(count($arg) < 3){ echo "引数が足りていません\n";return;}
018        $process = new XMLLoader($arg[2]);
019        break;
020    default:
021        echo "設定されていないコマンドです。\n";
022        return;
023    }
024    $process->execute();
025 $processes = new Launcher();
026 $processes->setProcesses($process->processes);
027 //$processes->isQueue = false;
028 $processes->execute();
029  
030}
031 
032 
033/***********************
034 *
035 * 抽象クラス
036 *
037 **********************/
038abstract class AbstractProcess{  
039    abstract public function execute();
040    abstract public static function toString();
041}
042 
043class Process
044{
045 public $params;
046 public $name;
047  
048 public function Process($name,$params){
049  $this->name = $name;
050  $this->params  = $params;
051 }
052  
053 public static function create($name,$params)
054 {
055  $className  = $name;
056  $classParams = $params;
057        if(class_exists($className)){
058            $process = new $className($classParams);
059        }else{
060            echo $className . "という処理がみつかりません。\n";
061        }
062  return $process;
063 }
064}
065 
066/***********************
067 *
068 * 複数コマンドの実行用
069 *
070 ***********************/
071 
072final class Launcher extends AbstractProcess{
073  
074 public $processes;
075 public $isQueue;
076  
077 public function Launcher(){
078  $this->isQueue = true;
079 }
080  
081 public function setProcesses($value){
082  $this->processes = $value;
083 }
084  
085 public function execute(){
086  while(count($this->processes) > 0){
087   if($this->isQueue){
088    $process = array_shift($this->processes);
089   }else{
090    $process = array_pop($this->processes);
091   }
092   $process->execute();
093  }
094 }
095  
096 public static function toString(){
097  return "Launcher";
098 }
099}
100 
101 
102/***********************
103 *
104 * コマンドローダー
105 *
106 ***********************/
107 
108class XMLLoader extends AbstractProcess{
109     
110 
111     
112    private $path = "";
113    public $processes;
114         
115    public function XMLLoader($path){
116        $this->path = $path;
117        $this->processes = array();
118    }
119 
120    public function execute(){
121         
122        if(!file_exists($this->path)) {
123            echo "ファイルが存在しません\n";
124            return;
125        }
126        try{
127            $xml = simplexml_load_file($this->path);
128        }catch(Exception $e ){
129            echo "XMLの書式が間違っています\n";
130            return;
131        }
132 
133        foreach( $xml->process as $process){
134            $name = (string)($process->name);
135            $param = (string)($process->param);
136   $prc = Process::create($name,$param);
137 
138            if($prc instanceof AbstractProcess)
139                array_push($this->processes,$prc);
140        }
141    }
142 
143    public static function toString()
144    {
145        return "XMLLoader";
146    }
147}
148 
149/***********************
150 *
151 * サンプルコマンド
152 *
153 ***********************/
154class Test extends AbstractProcess
155{
156    private  $param;
157    public function Test($param){
158        $this->param = $param;
159    }
160 
161    public function execute(){
162         
163        echo $this->param . "\n";
164    }
165 
166    public static function toString()
167    {
168        return "Test";
169    }
170 
171}


これを使って以下のXMLを読み込んで実行する。
01<data>
02  <process>
03    <name>Test</name>
04    <param >param1</param>
05  </command>
06  <process>
07    <name>Test</name>
08    <param >param2</param>
09  </process>
10</data>


実行

1mr-elephant:php shuzo$ php process.php xml ./process.xml
2param1
3param2


とりあえず必要なものだけを実装してみました。
もうちょいなんか工夫できそうな気がします。

というかGithubにあげてみたいと思ったのですが、うまくいってません。orz

※インデントが気持ち悪いところだけ修正しました。
※commandという名前はあまりよくないというご指摘を受けたので、修正しました。
どうせなので、微妙にリファクタリングを追加。

0 件のコメント:

コメントを投稿